import { selectionCopyShow, selectIsOverlap } from './select'
import { luckyColor, iconfontObjects } from './constant'
import luckysheetConfigsetting from './luckysheetConfigsetting'
import luckysheetMoreFormat from './moreFormat'
import alternateformat from './alternateformat'
import conditionformat from './conditionformat'
import server from './server'
import { luckysheet_searcharray } from './sheetSearch'
import luckysheetFreezen from './freezen'
import luckysheetsizeauto from './resize'
import { createFilter } from './filter'
import luckysheetSearchReplace from './searchReplace'
import luckysheetLocationCell from './locationCell'
import ifFormulaGenerator from './ifFormulaGenerator'
import { luckysheetupdateCell } from './updateCell'
import insertFormula from './insertFormula'
import sheetmanage from './sheetmanage'
import luckysheetPostil from './postil'
import { hideloading, showloading } from '../global/loading.js'
//import { luckysheetlodingHTML } from '../controllers/constant'
import { getSheet, getSheetDataToJson } from '../global/api'
import { getAjaxDICT } from '../global/dictRenderData'
import {
  isRealNum,
  isRealNull,
  isEditMode,
  hasPartMC,
  checkIsAllowEdit,
} from '../global/validate'
import tooltip from '../global/tooltip'
import editor from '../global/editor'
import { genarate, update, is_date } from '../global/format'
import { jfrefreshgrid, luckysheetrefreshgrid } from '../global/refresh'
import { sortSelection } from '../global/sort'
import formula from '../global/formula'
import { rowLocationByIndex, colLocationByIndex } from '../global/location'
import { isdatatypemulti } from '../global/datecontroll'
import { rowlenByRange, getCellTextSplitArr } from '../global/getRowlen'
import { setcellvalue } from '../global/setdata'
import { getFontStyleByCell, checkstatusByCell } from '../global/getdata'
import { countfunc } from '../global/count'
import { hideMenuByCancel } from '../global/cursorPos'
import { getSheetIndex, getRangetxt, getluckysheetfile } from '../methods/get'
import { setluckysheetfile } from '../methods/set'
import { modelHTML } from './constant'
import {
  isInlineStringCell,
  isInlineStringCT,
  updateInlineStringFormat,
  convertCssToStyleList,
  inlineStyleAffectAttribute,
  updateInlineStringFormatOutside,
} from './inlineString'
import {
  replaceHtml,
  getObjType,
  mouseclickposition,
  luckysheetContainerFocus,
} from '../utils/util'
import {
  openProtectionModal,
  checkProtectionFormatCells,
  checkProtectionNotEnable,
} from './protection'
import { openDataConfigurationModal } from './DataConfiguration'
import Store from '../store'
import locale from '../locale/locale'
import {
  checkTheStatusOfTheSelectedCells,
  frozenFirstRow,
  frozenFirstColumn,
} from '../global/api'
import { domDestroyed } from './listener'
const _locale = locale()
const locale_border = _locale.border
const locale_toolbar = _locale.toolbar
const locale_button = _locale.button
let submitFlag = false
const menuButton = {
  menu:
    '<div class="luckysheet-cols-menu luckysheet-rightgclick-menu luckysheet-menuButton ${subclass} luckysheet-mousedown-cancel" id="luckysheet-icon-${id}-menuButton">${item}</div>',
  // "item": '<div itemvalue="${value}" itemname="${name}" class="luckysheet-cols-menuitem ${sub} luckysheet-mousedown-cancel"><div class="luckysheet-cols-menuitem-content luckysheet-mousedown-cancel" style="padding: 3px 0px 3px 1px;"><span style="margin-right:3px;width:13px;display:inline-block;" class="icon luckysheet-mousedown-cancel"></span> ${name} <span class="luckysheet-submenu-arrow luckysheet-mousedown-cancel" style="user-select: none;">${example}</span></div></div>',
  item:
    '<div itemvalue="${value}" itemname="${name}" class="luckysheet-cols-menuitem ${sub} luckysheet-mousedown-cancel"><div class="luckysheet-cols-menuitem-content luckysheet-mousedown-cancel" style="padding: 3px 0px 3px 1px;"><span style="margin-right:3px;width:13px;display:inline-block;" class="icon luckysheet-mousedown-cancel"></span> ${name} <span class="luckysheet-submenu-arrow luckysheet-mousedown-cancel ${iconClass}" style="user-select: none;">${example}</span></div></div>',
  split:
    '<div class="luckysheet-menuseparator luckysheet-mousedown-cancel" role="separator"></div>',
  color:
    '<div class="luckysheet-cols-menu luckysheet-rightgclick-menu luckysheet-rightgclick-menu-sub luckysheet-mousedown-cancel luckysheet-menuButton ${sub}" id="${id}"><div class="luckysheet-cols-menuitem luckysheet-mousedown-cancel luckysheet-color-reset"><div class="luckysheet-cols-menuitem-content luckysheet-mousedown-cancel">${resetColor}</div></div> <div class="luckysheet-mousedown-cancel"> <div class="luckysheet-mousedown-cancel"> <input type="text" class="luckysheet-color-selected" /> </div> </div> <div class="luckysheet-menuseparator luckysheet-mousedown-cancel" role="separator"></div> ${coloritem}</div>',
  coloritem:
    '<div class="luckysheet-cols-menuitem luckysheet-mousedown-cancel ${class}"><div class="luckysheet-cols-menuitem-content luckysheet-mousedown-cancel">${name}</div></div>',
  subcolor:
    '<div id="luckysheet-icon-${id}-menuButton" class="luckysheet-cols-menu luckysheet-rightgclick-menu luckysheet-rightgclick-menu-sub luckysheet-menuButton-sub luckysheet-mousedown-cancel"> <div class="luckysheet-mousedown-cancel"> <div class="luckysheet-mousedown-cancel"> <input type="text" class="luckysheet-color-selected" /> </div> </div></div>',
  rightclickmenu: null,
  submenuhide: {},
  selectRange: [],
  focus: function ($obj, value) {
    if ($obj.attr('id') == 'luckysheet-icon-font-family-menuButton') {
      if (isdatatypemulti(value)['num']) {
        let _locale = locale()
        const locale_fontarray = _locale.fontarray
        value = locale_fontarray[parseInt(value)]
        if (value == null) {
          value = this.defualtFont[itemvalue]
        }
      }
    }
    $obj
      .find('.luckysheet-cols-menuitem')
      .find('span.icon')
      .html('')
    if (value == null) {
      $obj
        .find('.luckysheet-cols-menuitem')
        .eq(0)
        .find('span.icon')
        .html('<i class="fa fa-check luckysheet-mousedown-cancel"></i>')
    } else {
      $obj
        .find(".luckysheet-cols-menuitem[itemvalue='" + value + "']")
        .find('span.icon')
        .html('<i class="fa fa-check luckysheet-mousedown-cancel"></i>')
    }
  },
  createButtonMenu: function (itemdata) {
    let itemset = ''
    let _this = this

    for (let i = 0; i < itemdata.length; i++) {
      let item = itemdata[i]

      if (item.value == 'split') {
        itemset += _this.split
      } else {
        if (item.example == 'more') {
          // itemset += replaceHtml(_this.item, {"value": item.value, "name": item.text, "example": "►", "sub": "luckysheet-cols-submenu"});
          itemset += replaceHtml(_this.item, {
            value: item.value,
            name: item.text,
            example: '',
            sub: 'luckysheet-cols-submenu',
            iconClass: 'lksticonfont luckysheet-lksticonfont -youjiantou',
          })
        } else {
          itemset += replaceHtml(_this.item, {
            value: item.value,
            name: item.text,
            example: item.example,
            sub: '',
            iconClass: '',
          })
        }
      }
    }

    return itemset
  },
  cancelPaintModel: function () {
    let _this = this

    $('#luckysheet-sheettable_0').removeClass('luckysheetPaintCursor')

    if (
      Store.luckysheet_copy_save['dataSheetIndex'] == Store.currentSheetIndex
    ) {
      Store.luckysheet_selection_range = []
      selectionCopyShow()
    } else {
      Store.luckysheetfile[
        getSheetIndex(Store.luckysheet_copy_save['dataSheetIndex'])
      ].luckysheet_selection_range = []
    }

    Store.luckysheet_copy_save = {}

    _this.luckysheetPaintModelOn = false
    $('#luckysheetpopover').fadeOut(200, function () {
      $('#luckysheetpopover').remove()
    })
  },
  luckysheetPaintModelOn: false,
  luckysheetPaintSingle: false,
  initialMenuButton: function () {
    let _this = this

    //格式刷
    $('#luckysheet-icon-paintformat').click(function (e) {
      // *如果禁止前台编辑，则中止下一步操作
      if (!checkIsAllowEdit()) {
        tooltip.info('', locale().pivotTable.errorNotAllowEdit)
        return
      }
      e.stopPropagation()
      let _locale = locale()
      let locale_paint = _locale.paint

      if (
        Store.luckysheet_select_save == null ||
        Store.luckysheet_select_save.length == 0
      ) {
        if (isEditMode()) {
          alert(locale_paint.tipSelectRange)
        } else {
          tooltip.info('', locale_paint.tipSelectRange)
        }
        return
      } else if (Store.luckysheet_select_save.length > 1) {
        if (isEditMode()) {
          alert(locale_paint.tipNotMulti)
        } else {
          tooltip.info('', locale_paint.tipNotMulti)
        }
        return
      }

      // *增加了对选区范围是否为部分合并单元格的校验，如果为部分合并单元格，就阻止格式刷的下一步
      // TODO 这里也可以改为：判断到是合并单元格的一部分后，格式刷执行黏贴格式后删除范围单元格的 mc 值

      let has_PartMC = false

      let r1 = Store.luckysheet_select_save[0].row[0],
        r2 = Store.luckysheet_select_save[0].row[1]

      let c1 = Store.luckysheet_select_save[0].column[0],
        c2 = Store.luckysheet_select_save[0].column[1]

      has_PartMC = hasPartMC(Store.config, r1, r2, c1, c2)

      if (has_PartMC) {
        // *提示后中止下一步
        tooltip.info('无法对部分合并单元格执行此操作', '')
        return
      }

      tooltip.popover(
        "<i class='fa fa-paint-brush'></i> " + locale_paint.start + '',
        'topCenter',
        true,
        null,
        locale_paint.end,
        function () {
          _this.cancelPaintModel()
        }
      )

      $('#luckysheet-sheettable_0').addClass('luckysheetPaintCursor')

      Store.luckysheet_selection_range = [
        {
          row: Store.luckysheet_select_save[0].row,
          column: Store.luckysheet_select_save[0].column,
        },
      ]

      selectionCopyShow()

      let RowlChange = false,
        HasMC = false

      for (
        let r = Store.luckysheet_select_save[0].row[0];
        r <= Store.luckysheet_select_save[0].row[1];
        r++
      ) {
        if (
          Store.config['rowhidden'] != null &&
          Store.config['rowhidden'][r] != null
        ) {
          continue
        }

        if (Store.config['rowlen'] != null && r in Store.config['rowlen']) {
          RowlChange = true
        }

        for (
          let c = Store.luckysheet_select_save[0].column[0];
          c <= Store.luckysheet_select_save[0].column[1];
          c++
        ) {
          let cell = Store.flowdata[r][c]

          if (
            getObjType(cell) == 'object' &&
            'mc' in cell &&
            cell.mc.rs != null
          ) {
            HasMC = true
          }
        }
      }
      Store.luckysheet_copy_save = {
        dataSheetIndex: Store.currentSheetIndex,
        copyRange: [
          {
            row: Store.luckysheet_select_save[0].row,
            column: Store.luckysheet_select_save[0].column,
          },
        ],
        RowlChange: RowlChange,
        HasMC: HasMC,
      }

      _this.luckysheetPaintModelOn = true
      _this.luckysheetPaintSingle = true
    })
    $('#luckysheet-icon-paintformat').dblclick(function () {
      // *如果禁止前台编辑，则中止下一步操作
      if (!checkIsAllowEdit()) {
        tooltip.info('', locale().pivotTable.errorNotAllowEdit)
        return
      }
      let _locale = locale()
      let locale_paint = _locale.paint
      if (
        Store.luckysheet_select_save == null ||
        Store.luckysheet_select_save.length == 0
      ) {
        if (isEditMode()) {
          alert(locale_paint.tipSelectRange)
        } else {
          tooltip.info('', locale_paint.tipSelectRange)
        }
        return
      } else if (Store.luckysheet_select_save.length > 1) {
        if (isEditMode()) {
          alert(locale_paint.tipNotMulti)
        } else {
          tooltip.info('', locale_paint.tipNotMulti)
        }
        return
      }

      tooltip.popover(
        "<i class='fa fa-paint-brush'></i> " + locale_paint.start,
        'topCenter',
        true,
        null,
        locale_paint.end,
        function () {
          _this.cancelPaintModel()
        }
      )
      $('#luckysheet-sheettable_0').addClass('luckysheetPaintCursor')

      Store.luckysheet_selection_range = [
        {
          row: Store.luckysheet_select_save[0].row,
          column: Store.luckysheet_select_save[0].column,
        },
      ]
      selectionCopyShow()

      let RowlChange = false,
        HasMC = false
      for (
        let r = Store.luckysheet_select_save[0].row[0];
        r <= Store.luckysheet_select_save[0].row[1];
        r++
      ) {
        if (
          Store.config['rowhidden'] != null &&
          Store.config['rowhidden'][r] != null
        ) {
          continue
        }

        if (Store.config['rowlen'] != null && r in Store.config['rowlen']) {
          RowlChange = true
        }

        for (
          let c = Store.luckysheet_select_save[0].column[0];
          c <= Store.luckysheet_select_save[0].column[1];
          c++
        ) {
          let cell = Store.flowdata[r][c]

          if (
            getObjType(cell) == 'object' &&
            'mc' in cell &&
            cell.mc.rs != null
          ) {
            HasMC = true
          }
        }
      }
      Store.luckysheet_copy_save = {
        dataSheetIndex: Store.currentSheetIndex,
        copyRange: [
          {
            row: Store.luckysheet_select_save[0].row,
            column: Store.luckysheet_select_save[0].column,
          },
        ],
        RowlChange: RowlChange,
        HasMC: HasMC,
      }

      _this.luckysheetPaintModelOn = true
      _this.luckysheetPaintSingle = false
    })

    //货币格式
    $('#luckysheet-icon-currency').click(function () {
      let d = editor.deepCopyFlowData(Store.flowdata) //取数据

      _this.updateFormat(d, 'ct', '¥ #.00')
    })

    //百分比
    $('#luckysheet-icon-percent').click(function () {
      let d = editor.deepCopyFlowData(Store.flowdata) //取数据

      _this.updateFormat(d, 'ct', '0.00%')
    })

    //减少小数位数
    $('#luckysheet-icon-fmt-decimal-decrease').click(function () {
      let d = editor.deepCopyFlowData(Store.flowdata) //取数据
      let row_index = Store.luckysheet_select_save[0]['row_focus'],
        col_index = Store.luckysheet_select_save[0]['column_focus']
      let foucsStatus = _this.checkstatus(d, row_index, col_index, 'ct')
      let cell = d[row_index][col_index]

      if (foucsStatus == null || foucsStatus.t != 'n') {
        return
      }

      if (foucsStatus.fa == 'General') {
        let mask = genarate(cell.v)
        foucsStatus = mask[1]
      }

      //万亿格式
      let reg = /^(w|W)((0?)|(0\.0+))$/
      if (reg.test(foucsStatus.fa)) {
        if (foucsStatus.fa.indexOf('.') > -1) {
          if (foucsStatus.fa.substr(-2) == '.0') {
            _this.updateFormat(d, 'ct', foucsStatus.fa.split('.')[0])
          } else {
            _this.updateFormat(
              d,
              'ct',
              foucsStatus.fa.substr(0, foucsStatus.fa.length - 1)
            )
          }
        } else {
          _this.updateFormat(d, 'ct', foucsStatus.fa)
        }

        return
      }
      //Uncaught ReferenceError: Cannot access 'fa' before initialization
      let prefix = '',
        main = '',
        fa = []
      if (foucsStatus.fa.indexOf('.') > -1) {
        fa = foucsStatus.fa.split('.')
        prefix = fa[0]
        main = fa[1]
      } else {
        return
      }

      fa = main.split('')
      let tail = ''
      for (let i = fa.length - 1; i >= 0; i--) {
        let c = fa[i]
        if (c != '#' && c != '0' && c != ',' && isNaN(parseInt(c))) {
          tail = c + tail
        } else {
          break
        }
      }

      let fmt = ''
      if (foucsStatus.fa.indexOf('.') > -1) {
        let suffix = main
        if (tail.length > 0) {
          suffix = main.replace(tail, '')
        }

        let pos = suffix.replace(/#/g, '0')
        pos = pos.substr(0, pos.length - 1)
        if (pos == '') {
          fmt = prefix + tail
        } else {
          fmt = prefix + '.' + pos + tail
        }
      }

      _this.updateFormat(d, 'ct', fmt)
    })

    //增加小数位数
    $('#luckysheet-icon-fmt-decimal-increase').click(function () {
      let d = editor.deepCopyFlowData(Store.flowdata) //取数据
      let row_index = Store.luckysheet_select_save[0]['row_focus'],
        col_index = Store.luckysheet_select_save[0]['column_focus']
      let foucsStatus = _this.checkstatus(d, row_index, col_index, 'ct')
      let cell = d[row_index][col_index]

      if (foucsStatus == null || foucsStatus.t != 'n') {
        return
      }

      if (foucsStatus.fa == 'General') {
        let mask = genarate(cell.v)
        foucsStatus = mask[1]
      }

      if (foucsStatus.fa == 'General') {
        _this.updateFormat(d, 'ct', '#.0')
        return
      }

      //万亿格式
      let reg = /^(w|W)((0?)|(0\.0+))$/
      if (reg.test(foucsStatus.fa)) {
        if (foucsStatus.fa.indexOf('.') > -1) {
          _this.updateFormat(d, 'ct', foucsStatus.fa + '0')
        } else {
          if (foucsStatus.fa.substr(-1) == '0') {
            _this.updateFormat(d, 'ct', foucsStatus.fa + '.0')
          } else {
            _this.updateFormat(d, 'ct', foucsStatus.fa + '0.0')
          }
        }

        return
      }

      //Uncaught ReferenceError: Cannot access 'fa' before initialization
      let prefix = '',
        main = '',
        fa = []

      if (foucsStatus.fa.indexOf('.') > -1) {
        fa = foucsStatus.fa.split('.')
        prefix = fa[0]
        main = fa[1]
      } else {
        main = foucsStatus.fa
      }

      fa = main.split('')
      let tail = ''
      for (let i = fa.length - 1; i >= 0; i--) {
        let c = fa[i]
        if (c != '#' && c != '0' && c != ',' && isNaN(parseInt(c))) {
          tail = c + tail
        } else {
          break
        }
      }

      let fmt = ''
      if (foucsStatus.fa.indexOf('.') > -1) {
        let suffix = main
        if (tail.length > 0) {
          suffix = main.replace(tail, '')
        }

        let pos = suffix.replace(/#/g, '0')
        pos += '0'
        fmt = prefix + '.' + pos + tail
      } else {
        if (tail.length > 0) {
          fmt = main.replace(tail, '') + '.0' + tail
        } else {
          fmt = main + '.0' + tail
        }
      }

      _this.updateFormat(d, 'ct', fmt)
    })

    //更多格式
    $('#luckysheet-icon-fmt-other').click(function () {
      const _locale = locale()
      const locale_format = _locale.format
      const locale_defaultFmt = _locale.defaultFmt

      let menuButtonId = $(this).attr('id') + '-menuButton'
      let $menuButton = $('#' + menuButtonId)

      if ($menuButton.length == 0) {
        let itemdata = locale_defaultFmt

        let itemset = _this.createButtonMenu(itemdata)

        // luckysheet-menuButton-sub
        let menu = replaceHtml(_this.menu, {
          id: 'fmt-other',
          item: itemset,
          subclass: '',
          sub: '',
        })

        let subitemdata = [
          {
            text: locale_format.moreCurrency + '...',
            value: 'morecurrency',
            example: '',
          },
          {
            text: locale_format.moreDateTime + '...',
            value: 'moredatetime',
            example: '',
          },
          {
            text: locale_format.moreNumber + '...',
            value: 'moredigit',
            example: '',
          },
        ]
        let subitemset = _this.createButtonMenu(subitemdata)
        let submenu = replaceHtml(_this.menu, {
          id: 'fmtOtherSelf',
          item: subitemset,
          subclass: 'luckysheet-menuButton-sub',
        })

        //luckysheet-icon-fmt-other-menuButton_sub
        $('body')
          .first()
          .append(menu + submenu)
        $menuButton = $('#' + menuButtonId).width(250)
        _this.focus($menuButton)

        $menuButton.find('.luckysheet-cols-menuitem').click(function () {
          $menuButton.hide()
          luckysheetContainerFocus()

          let $t = $(this),
            itemvalue = $t.attr('itemvalue'),
            itemname = $t.attr('itemname')
          $('#luckysheet-icon-fmt-other')
            .find('.luckysheet-toolbar-menu-button-caption')
            .html(' ' + itemname + ' ')

          if (itemvalue == 'fmtOtherSelf') {
            return
          }

          let d = editor.deepCopyFlowData(Store.flowdata) //取数据
          _this.focus($menuButton, itemvalue)

          _this.updateFormat(d, 'ct', itemvalue)
        })

        //更多格式
        $('#luckysheet-icon-fmtOtherSelf-menuButton')
          .find('.luckysheet-cols-menuitem')
          .click(function () {
            $menuButton.hide()
            $('#luckysheet-icon-fmtOtherSelf-menuButton').hide()
            luckysheetContainerFocus()

            let itemvalue = $(this).attr('itemvalue')

            luckysheetMoreFormat.createDialog(itemvalue)
            luckysheetMoreFormat.init()
          })
      } else {
        const text = $(this)
          .find('.luckysheet-toolbar-menu-button-caption')
          .text()
          .trim()
        const format = locale_defaultFmt.find((f) => f.text === text)
        if (format) {
          _this.focus($menuButton, format.value)
        }
      }

      let userlen = $(this).outerWidth()
      let tlen = $menuButton.outerWidth()

      let menuleft = $(this).offset().left
      if (
        tlen > userlen &&
        tlen + menuleft > $('#' + Store.container).width()
      ) {
        menuleft = menuleft - tlen + userlen
      }
      mouseclickposition(
        $menuButton,
        menuleft,
        $(this).offset().top + 25,
        'lefttop'
      )
    })

    //字体设置
    $('#luckysheet-icon-font-family')
      .mousedown(function (e) {
        hideMenuByCancel(e)
        e.stopPropagation()
      })
      .click(function () {
        let menuButtonId = $(this).attr('id') + '-menuButton'
        let $menuButton = $('#' + menuButtonId)
        if ($menuButton.length == 0) {
          // const locale_fontarray = locale().fontarray;
          // let itemdata = [];

          // for(let a=0;a<locale_fontarray.length;a++){
          //     let fItem = locale_fontarray[a];
          //     let ret = {};
          //     ret.value = a;
          //     ret.text = "<span class='luckysheet-mousedown-cancel' style='font-size:11px;font-family:"+fItem+"'>"+fItem+"</span>";
          //     ret.example = "";
          //     itemdata.push(ret);
          // }

          let itemset = _this.createButtonMenu(_this.fontSelectList)

          let menu = replaceHtml(_this.menu, {
            id: 'font-family',
            item: itemset,
            subclass: '',
            sub: '',
          })

          $('body')
            .first()
            .append(menu)
          $menuButton = $('#' + menuButtonId).width(200)
          _this.focus($menuButton)

          $menuButton.on('click', '.luckysheet-cols-menuitem', function () {
            $menuButton.hide()
            luckysheetContainerFocus()

            let $t = $(this),
              itemvalue = $t.attr('itemvalue'),
              itemname = $t.attr('itemname')
            _this.focus($menuButton, itemvalue)
            $('#luckysheet-icon-font-family')
              .find('.luckysheet-toolbar-menu-button-caption')
              .html(' ' + itemname + ' ')

            let d = editor.deepCopyFlowData(Store.flowdata)

            _this.updateFormat(d, 'ff', itemvalue)
          })
        }

        let userlen = $(this).outerWidth()
        let tlen = $menuButton.outerWidth()

        let menuleft = $(this).offset().left
        if (
          tlen > userlen &&
          tlen + menuleft > $('#' + Store.container).width()
        ) {
          menuleft = menuleft - tlen + userlen
        }
        mouseclickposition(
          $menuButton,
          menuleft,
          $(this).offset().top + 25,
          'lefttop'
        )
      })

    //字体颜色
    $('#luckysheet-icon-text-color')
      .mousedown(function (e) {
        hideMenuByCancel(e)
        e.stopPropagation()
      })
      .click(function () {
        let d = editor.deepCopyFlowData(Store.flowdata)
        let color = $(this).attr('color')
        if (color == null) {
          color = '#000000'
        }
        _this.updateFormat(d, 'fc', color)
      })

    $('#luckysheet-icon-text-color-menu')
      .mousedown(function (e) {
        hideMenuByCancel(e)
        e.stopPropagation()
      })
      .click(function () {
        let menuButtonId = $(this).attr('id') + '-menuButton'
        let $menuButton = $('#' + menuButtonId)

        if ($menuButton.length == 0) {
          const _locale = locale()
          const locale_toolbar = _locale.toolbar
          const locale_button = _locale.button
          const locale_alternatingColors = _locale.alternatingColors
          let itemdata = [
            {
              name: locale_toolbar.alternatingColors + '...',
              id: 'luckysheet-color-alternate',
              example: '',
            },
          ]

          let itemset = _this.createButtonMenu(itemdata)
          let subid = 'text-color-self'
          let coloritem = replaceHtml(_this.coloritem, {
            class: 'luckysheet-icon-alternateformat',
            name: locale_toolbar.alternatingColors + '...',
          })
          let menu = replaceHtml(_this.color, {
            id: menuButtonId,
            coloritem: coloritem,
            colorself: subid,
            sub: '',
            resetColor: locale_toolbar.resetColor,
          })

          $('body')
            .first()
            .append(menu)
          $menuButton = $('#' + menuButtonId)

          $('#' + menuButtonId)
            .find('.luckysheet-color-selected')
            .spectrum({
              showPalette: true,
              showPaletteOnly: true,
              preferredFormat: 'hex',
              clickoutFiresChange: false,
              showInitial: true,
              showInput: true,
              flat: true,
              hideAfterPaletteSelect: true,
              showSelectionPalette: true,
              maxPaletteSize: 8,
              maxSelectionSize: 8,
              cancelText: locale_button.cancel,
              chooseText: locale_button.confirm,
              togglePaletteMoreText: locale_toolbar.customColor,
              togglePaletteLessText: locale_toolbar.collapse,
              togglePaletteOnly: true,
              clearText: locale_toolbar.clearText,
              color: luckysheetConfigsetting.defaultTextColor,
              noColorSelectedText: locale_toolbar.noColorSelectedText,
              localStorageKey: 'spectrum.textcolor' + server.gridKey,
              palette: [
                [
                  '#000',
                  '#444',
                  '#666',
                  '#999',
                  '#ccc',
                  '#eee',
                  '#f3f3f3',
                  '#fff',
                ],
                [
                  '#f00',
                  '#f90',
                  '#ff0',
                  '#0f0',
                  '#0ff',
                  '#00f',
                  '#90f',
                  '#f0f',
                ],
                [
                  '#f4cccc',
                  '#fce5cd',
                  '#fff2cc',
                  '#d9ead3',
                  '#d0e0e3',
                  '#cfe2f3',
                  '#d9d2e9',
                  '#ead1dc',
                ],
                [
                  '#ea9999',
                  '#f9cb9c',
                  '#ffe599',
                  '#b6d7a8',
                  '#a2c4c9',
                  '#9fc5e8',
                  '#b4a7d6',
                  '#d5a6bd',
                ],
                [
                  '#e06666',
                  '#f6b26b',
                  '#ffd966',
                  '#93c47d',
                  '#76a5af',
                  '#6fa8dc',
                  '#8e7cc3',
                  '#c27ba0',
                ],
                [
                  '#c00',
                  '#e69138',
                  '#f1c232',
                  '#6aa84f',
                  '#45818e',
                  '#3d85c6',
                  '#674ea7',
                  '#a64d79',
                ],
                [
                  '#900',
                  '#b45f06',
                  '#bf9000',
                  '#38761d',
                  '#134f5c',
                  '#0b5394',
                  '#351c75',
                  '#741b47',
                ],
                [
                  '#600',
                  '#783f04',
                  '#7f6000',
                  '#274e13',
                  '#0c343d',
                  '#073763',
                  '#20124d',
                  '#4c1130',
                ],
              ],
              change: function (color) {
                let $input = $(this)
                if (color != null) {
                  color = color.toHexString()
                } else {
                  color = '#000'
                }

                let oldcolor = null
                // $("#luckysheet-icon-text-color .luckysheet-color-menu-button-indicator").css("border-bottom-color", color);
                // 下边框换成了一个DIV
                $('#luckysheet-icon-text-color .text-color-bar').css(
                  'background-color',
                  color
                )
                $('#luckysheet-icon-text-color').attr('color', color)

                let d = editor.deepCopyFlowData(Store.flowdata)
                _this.updateFormat(d, 'fc', color)

                $menuButton.hide()
                luckysheetContainerFocus()
              },
            })

          $menuButton.find('.luckysheet-color-reset').click(function () {
            $menuButton.hide()
            luckysheetContainerFocus()

            let $input = $('#' + menuButtonId).find(
              '.luckysheet-color-selected'
            )
            $input.val('#000000')
            $('#luckysheet-icon-text-color').attr('color', null)
            $input.spectrum('set', '#000000')
            $(
              '#luckysheet-icon-text-color .luckysheet-color-menu-button-indicator'
            ).css('border-bottom-color', '#000000')

            let d = editor.deepCopyFlowData(Store.flowdata)
            _this.updateFormat(d, 'fc', null)
          })

          //交替颜色
          $menuButton
            .find('.luckysheet-icon-alternateformat')
            .click(function () {
              $menuButton.hide()
              luckysheetContainerFocus()

              if (Store.luckysheet_select_save.length > 1) {
                if (isEditMode()) {
                  alert(locale_alternatingColors.errorInfo)
                } else {
                  tooltip.info(locale_alternatingColors.errorInfo, '')
                }
                return
              }

              let range = $.extend(true, {}, Store.luckysheet_select_save[0])

              let isExists = alternateformat.rangeIsExists(range)[0]
              if (!isExists) {
                alternateformat.modelfocusIndex = 0
                alternateformat.new(range)
              }

              alternateformat.init()
              alternateformat.perfect()
            })
        }

        let userlen = $(this).outerWidth()
        let tlen = $menuButton.outerWidth()

        let menuleft = $(this).offset().left
        if (
          tlen > userlen &&
          tlen + menuleft > $('#' + Store.container).width()
        ) {
          menuleft = menuleft - tlen + userlen
        }

        let offsetTop = $(this).offset().top + 26
        setTimeout(function () {
          let $input = $('#' + menuButtonId).find('.luckysheet-color-selected')
          $input.spectrum('set', $input.val())
          mouseclickposition($menuButton, menuleft - 28, offsetTop, 'lefttop')
        }, 1)
      })

    //背景颜色
    $('#luckysheet-icon-cell-color').click(function () {
      let d = editor.deepCopyFlowData(Store.flowdata)
      let color = $(this).attr('color')
      if (color == null) {
        color = '#ffffff'
      }
      _this.updateFormat(d, 'bg', color)
    })

    $('#luckysheet-icon-cell-color-menu').click(function () {
      let menuButtonId = $(this).attr('id') + '-menuButton'
      let $menuButton = $('#' + menuButtonId)

      if ($menuButton.length == 0) {
        let subid = 'cell-color-self'

        const _locale = locale()
        const locale_toolbar = _locale.toolbar
        const locale_button = _locale.button
        const locale_alternatingColors = _locale.alternatingColors

        let coloritem = replaceHtml(_this.coloritem, {
          class: 'luckysheet-icon-alternateformat',
          name: locale_toolbar.alternatingColors + '...',
        })
        let menu = replaceHtml(_this.color, {
          id: menuButtonId,
          coloritem: coloritem,
          colorself: subid,
          sub: '',
          resetColor: locale_toolbar.resetColor,
        })

        $('body')
          .first()
          .append(menu)
        $menuButton = $('#' + menuButtonId)

        $('#' + menuButtonId)
          .find('.luckysheet-color-selected')
          .spectrum({
            showPalette: true,
            showPaletteOnly: true,
            preferredFormat: 'hex',
            clickoutFiresChange: false,
            showInitial: true,
            showInput: true,
            flat: true,
            hideAfterPaletteSelect: true,
            showSelectionPalette: true,
            maxPaletteSize: 8,
            maxSelectionSize: 8,
            color: luckysheetConfigsetting.defaultCellColor,
            cancelText: locale_button.cancel,
            chooseText: locale_button.confirm,
            togglePaletteMoreText: locale_toolbar.customColor,
            togglePaletteLessText: locale_toolbar.collapse,
            togglePaletteOnly: true,
            clearText: locale_toolbar.clearText,
            noColorSelectedText: locale_toolbar.noColorSelectedText,
            localStorageKey: 'spectrum.bgcolor' + server.gridKey,
            palette: [
              [
                '#000',
                '#444',
                '#666',
                '#999',
                '#ccc',
                '#eee',
                '#f3f3f3',
                '#fff',
              ],
              ['#f00', '#f90', '#ff0', '#0f0', '#0ff', '#00f', '#90f', '#f0f'],
              [
                '#f4cccc',
                '#fce5cd',
                '#fff2cc',
                '#d9ead3',
                '#d0e0e3',
                '#cfe2f3',
                '#d9d2e9',
                '#ead1dc',
              ],
              [
                '#ea9999',
                '#f9cb9c',
                '#ffe599',
                '#b6d7a8',
                '#a2c4c9',
                '#9fc5e8',
                '#b4a7d6',
                '#d5a6bd',
              ],
              [
                '#e06666',
                '#f6b26b',
                '#ffd966',
                '#93c47d',
                '#76a5af',
                '#6fa8dc',
                '#8e7cc3',
                '#c27ba0',
              ],
              [
                '#c00',
                '#e69138',
                '#f1c232',
                '#6aa84f',
                '#45818e',
                '#3d85c6',
                '#674ea7',
                '#a64d79',
              ],
              [
                '#900',
                '#b45f06',
                '#bf9000',
                '#38761d',
                '#134f5c',
                '#0b5394',
                '#351c75',
                '#741b47',
              ],
              [
                '#600',
                '#783f04',
                '#7f6000',
                '#274e13',
                '#0c343d',
                '#073763',
                '#20124d',
                '#4c1130',
              ],
            ],
            change: function (color) {
              let $input = $(this)
              if (color != null) {
                color = color.toHexString()
              } else {
                color = '#fff'
              }

              let oldcolor = null
              // $("#luckysheet-icon-cell-color .luckysheet-color-menu-button-indicator").css("border-bottom-color", color);
              // 下边框换成了一个DIV
              $('#luckysheet-icon-cell-color .text-color-bar').css(
                'background-color',
                color
              )

              $('#luckysheet-icon-cell-color').attr('color', color)
              let d = editor.deepCopyFlowData(Store.flowdata)
              _this.updateFormat(d, 'bg', color)

              $menuButton.hide()
              luckysheetContainerFocus()
            },
          })

        $menuButton.find('.luckysheet-color-reset').click(function () {
          $menuButton.hide()
          luckysheetContainerFocus()

          let $input = $('#' + menuButtonId).find('.luckysheet-color-selected')
          $input.val('#ffffff')
          $('#luckysheet-icon-cell-color').attr('color', null)
          $input.spectrum('set', '#ffffff')
          $(
            '#luckysheet-icon-cell-color .luckysheet-color-menu-button-indicator'
          ).css('border-bottom-color', '#ffffff')

          let d = editor.deepCopyFlowData(Store.flowdata)
          _this.updateFormat(d, 'bg', null)
        })

        //交替颜色
        $menuButton.find('.luckysheet-icon-alternateformat').click(function () {
          // *如果禁止前台编辑，则中止下一步操作
          if (!checkIsAllowEdit()) {
            tooltip.info('', locale().pivotTable.errorNotAllowEdit)
            return
          }
          $menuButton.hide()
          luckysheetContainerFocus()

          if (Store.luckysheet_select_save.length > 1) {
            if (isEditMode()) {
              alert(locale_alternatingColors.errorInfo)
            } else {
              tooltip.info(locale_alternatingColors.errorInfo, '')
            }
            return
          }

          let range = $.extend(true, {}, Store.luckysheet_select_save[0])

          let isExists = alternateformat.rangeIsExists(range)[0]
          if (!isExists) {
            alternateformat.modelfocusIndex = 0
            alternateformat.new(range)
          }

          alternateformat.init()
          alternateformat.perfect()
        })

        $('#' + menuButtonId)
          .find('.luckysheet-color-selected')
          .val('#fff')
      }

      let userlen = $(this).outerWidth()
      let tlen = $menuButton.outerWidth()

      let menuleft = $(this).offset().left
      if (
        tlen > userlen &&
        tlen + menuleft > $('#' + Store.container).width()
      ) {
        menuleft = menuleft - tlen + userlen
      }

      let offsetTop = $(this).offset().top + 26
      setTimeout(function () {
        let $input = $('#' + menuButtonId).find('.luckysheet-color-selected')
        $input.spectrum('set', $input.val())
        mouseclickposition($menuButton, menuleft - 28, offsetTop, 'lefttop')
      }, 1)
    })

    //字体大小
    let luckysheet_fs_setTimeout = null
    $('#luckysheet-icon-font-size')
      .mousedown(function (e) {
        if (parseInt($('#luckysheet-input-box').css('top')) > 0) {
          let w = window.getSelection()
          if (w.type != 'None') {
            let range = w.getRangeAt(0)
            if (!range.collapsed) {
              Store.inlineStringEditRange = range.cloneRange()
            }
          }
        }
        hideMenuByCancel(e)
        e.stopPropagation()
      })
      .click(function () {
        let menuButtonId = $(this).attr('id') + '-menuButton'
        let $menuButton = $('#' + menuButtonId)

        if ($menuButton.length == 0) {
          let itemdata = [
            { text: '9', value: '9', example: '' },
            { text: '10', value: '10', example: '' },
            { text: '11', value: '11', example: '' },
            { text: '12', value: '12', example: '' },
            { text: '14', value: '14', example: '' },
            { text: '16', value: '16', example: '' },
            { text: '18', value: '18', example: '' },
            { text: '20', value: '20', example: '' },
            { text: '22', value: '22', example: '' },
            { text: '24', value: '24', example: '' },
            { text: '26', value: '26', example: '' },
            { text: '28', value: '28', example: '' },
            { text: '36', value: '36', example: '' },
            { text: '48', value: '48', example: '' },
            { text: '72', value: '72', example: '' },
          ]

          let itemset = _this.createButtonMenu(itemdata)

          let menu = replaceHtml(_this.menu, {
            id: 'font-size',
            item: itemset,
            subclass: '',
            sub: '',
          })

          $('body')
            .first()
            .append(menu)
          $menuButton = $('#' + menuButtonId).width(150)
          _this.focus($menuButton, 10)

          $menuButton.find('.luckysheet-cols-menuitem').click(function () {
            $menuButton.hide()
            luckysheetContainerFocus()

            let $t = $(this),
              itemvalue = $t.attr('itemvalue'),
              $input = $('#luckysheet-icon-font-size input')
            $('#luckysheet-icon-font-size').attr('itemvalue', itemvalue)
            _this.focus($menuButton, itemvalue)
            $input.val(itemvalue)

            let d = editor.deepCopyFlowData(Store.flowdata)
            _this.updateFormat(d, 'fs', itemvalue)

            clearTimeout(luckysheet_fs_setTimeout)
          })
        }

        let userlen = $(this).outerWidth()
        let tlen = $menuButton.outerWidth()

        let defualtvalue = $('#luckysheet-icon-font-size').attr('itemvalue')
        if (defualtvalue == null) {
          defualtvalue = 10
        }
        _this.focus($menuButton, defualtvalue)

        let menuleft = $(this).offset().left
        if (
          tlen > userlen &&
          tlen + menuleft > $('#' + Store.container).width()
        ) {
          menuleft = menuleft - tlen + userlen
        }
        mouseclickposition(
          $menuButton,
          menuleft,
          $(this).offset().top + 25,
          'lefttop'
        )
      })
      .find('input.luckysheet-toolbar-textinput')
      .keydown(function (e) {
        hideMenuByCancel(e)
        e.stopPropagation()
      })
      .keyup(function (e) {
        if (e.keyCode != 13) {
          //Enter
          return
        }

        let $this = $(this)

        let itemvalue = parseInt($this.val())
        let $menuButton = $('#luckysheet-icon-font-size-menuButton')
        _this.focus($menuButton, itemvalue)

        let d = editor.deepCopyFlowData(Store.flowdata)
        _this.updateFormat(d, 'fs', itemvalue)

        luckysheet_fs_setTimeout = setTimeout(function () {
          $menuButton.hide()
          $this.blur()
        }, 200)
      })

    //边框设置
    $('#luckysheet-icon-border-all').click(function () {
      // *如果禁止前台编辑，则中止下一步操作
      if (!checkIsAllowEdit()) {
        tooltip.info('', locale().pivotTable.errorNotAllowEdit)
        return
      }
      if (!checkProtectionFormatCells(Store.currentSheetIndex)) {
        return
      }

      let d = editor.deepCopyFlowData(Store.flowdata)

      let type = $(this).attr('type')
      if (type == null) {
        type = 'border-all'
      }

      let subcolormenuid = 'luckysheet-icon-borderColor-menuButton'
      let color = $('#' + subcolormenuid)
        .find('.luckysheet-color-selected')
        .val()
      let style = $('#luckysheetborderSizepreview').attr('itemvalue')

      if (color == null || color == '') {
        color = '#000'
      }

      if (style == null || style == '') {
        style = '1'
      }

      let cfg = $.extend(true, {}, Store.config)
      if (cfg['borderInfo'] == null) {
        cfg['borderInfo'] = []
      }

      let borderInfo = {
        rangeType: 'range',
        borderType: type,
        color: color,
        style: style,
        range: $.extend(true, [], Store.luckysheet_select_save),
      }

      cfg['borderInfo'].push(borderInfo)

      if (Store.clearjfundo) {
        Store.jfundo.length = 0

        let redo = []

        redo['type'] = 'borderChange'

        redo['config'] = $.extend(true, {}, Store.config)
        redo['curconfig'] = $.extend(true, {}, cfg)

        redo['sheetIndex'] = Store.currentSheetIndex

        Store.jfredo.push(redo)
      }

      server.saveParam('cg', Store.currentSheetIndex, cfg['borderInfo'], {
        k: 'borderInfo',
      })

      Store.config = cfg
      Store.luckysheetfile[getSheetIndex(Store.currentSheetIndex)].config =
        Store.config

      setTimeout(function () {
        luckysheetrefreshgrid()
      }, 1)
    })

    $('#luckysheet-icon-border-menu').click(function () {
      let menuButtonId = $(this).attr('id') + '-menuButton'
      let $menuButton = $('#' + menuButtonId)

      if ($menuButton.length == 0) {
        let canvasH = 10,
          canvasW = 120
        const _locale = locale()
        const locale_border = _locale.border
        const locale_toolbar = _locale.toolbar
        const locale_button = _locale.button
        let itemdata = [
          {
            text: locale_border.borderTop,
            value: 'border-top',
            example:
              '<div class="luckysheet-icon luckysheet-inline-block luckysheet-material-icon luckysheet-mousedown-cancel" style="user-select: none;opacity:1;"> <div aria-hidden="true" class="luckysheet-icon-img-container luckysheet-icon-img luckysheet-icon-border-top lksticonfont  luckysheet-lksticonfont -shangbiankuang" style="user-select: none;"> </div> </div>',
          },
          {
            text: locale_border.borderBottom,
            value: 'border-bottom',
            example:
              '<div class="luckysheet-icon luckysheet-inline-block luckysheet-material-icon luckysheet-mousedown-cancel" style="user-select: none;opacity:1;"> <div aria-hidden="true" class="luckysheet-icon-img-container luckysheet-icon-img luckysheet-icon-border-bottom lksticonfont  luckysheet-lksticonfont -xiabiankuang" style="user-select: none;"> </div> </div>',
          },
          {
            text: locale_border.borderLeft,
            value: 'border-left',
            example:
              '<div class="luckysheet-icon luckysheet-inline-block luckysheet-material-icon luckysheet-mousedown-cancel" style="user-select: none;opacity:1;"> <div aria-hidden="true" class="luckysheet-icon-img-container luckysheet-icon-img luckysheet-icon-border-left lksticonfont  luckysheet-lksticonfont -zuobiankuang" style="user-select: none;"> </div> </div>',
          },
          {
            text: locale_border.borderRight,
            value: 'border-right',
            example:
              '<div class="luckysheet-icon luckysheet-inline-block luckysheet-material-icon luckysheet-mousedown-cancel" style="user-select: none;opacity:1;"> <div aria-hidden="true" class="luckysheet-icon-img-container luckysheet-icon-img luckysheet-icon-border-right lksticonfont  luckysheet-lksticonfont -youbiankuang" style="user-select: none;"> </div> </div>',
          },
          { text: '', value: 'split', example: '' },
          {
            text: locale_border.borderNone,
            value: 'border-none',
            example:
              '<div class="luckysheet-icon luckysheet-inline-block luckysheet-material-icon luckysheet-mousedown-cancel" style="user-select: none;opacity:1;"> <div aria-hidden="true" class="luckysheet-icon-img-container luckysheet-icon-img luckysheet-icon-border-none lksticonfont  luckysheet-lksticonfont -wubiankuang" style="user-select: none;"> </div> </div>',
          },
          {
            text: locale_border.borderAll,
            value: 'border-all',
            example:
              '<div class="luckysheet-icon luckysheet-inline-block luckysheet-material-icon luckysheet-mousedown-cancel" style="user-select: none;opacity:1;"> <div aria-hidden="true" class="luckysheet-icon-img-container luckysheet-icon-img luckysheet-icon-border-all lksticonfont  luckysheet-lksticonfont -quanjiabiankuang" style="user-select: none;"> </div> </div>',
          },
          {
            text: locale_border.borderOutside,
            value: 'border-outside',
            example:
              '<div class="luckysheet-icon luckysheet-inline-block luckysheet-material-icon luckysheet-mousedown-cancel" style="user-select: none;opacity:1;"> <div aria-hidden="true" class="luckysheet-icon-img-container luckysheet-icon-img luckysheet-icon-border-outside lksticonfont  luckysheet-lksticonfont -sizhoujiabiankuang" style="user-select: none;"> </div> </div>',
          },
          { text: '', value: 'split', example: '' },
          {
            text: locale_border.borderInside,
            value: 'border-inside',
            example:
              '<div class="luckysheet-icon luckysheet-inline-block luckysheet-material-icon luckysheet-mousedown-cancel" style="user-select: none;opacity:1;"> <div aria-hidden="true" class="luckysheet-icon-img-container luckysheet-icon-img luckysheet-icon-border-inside lksticonfont  luckysheet-lksticonfont -neikuangxian" style="user-select: none;"> </div> </div>',
          },
          {
            text: locale_border.borderHorizontal,
            value: 'border-horizontal',
            example:
              '<div class="luckysheet-icon luckysheet-inline-block luckysheet-material-icon luckysheet-mousedown-cancel" style="user-select: none;opacity:1;"> <div aria-hidden="true" class="luckysheet-icon-img-container luckysheet-icon-img luckysheet-icon-border-horizontal lksticonfont  luckysheet-lksticonfont -neikuanghengxian" style="user-select: none;"> </div> </div>',
          },
          {
            text: locale_border.borderVertical,
            value: 'border-vertical',
            example:
              '<div class="luckysheet-icon luckysheet-inline-block luckysheet-material-icon luckysheet-mousedown-cancel" style="user-select: none;opacity:1;"> <div aria-hidden="true" class="luckysheet-icon-img-container luckysheet-icon-img luckysheet-icon-border-vertical lksticonfont  luckysheet-lksticonfont -neikuangshuxian" style="user-select: none;"> </div> </div>',
          },
          { text: '', value: 'split', example: '' },
          {
            text:
              "<span id='luckysheet-icon-borderColor-linecolor' class='luckysheet-mousedown-cancel' style='border-bottom:3px solid #000;'>" +
              locale_border.borderColor +
              '</span>',
            value: 'borderColor',
            example: 'more',
          },
          {
            text:
              '' +
              locale_border.borderSize +
              "<img id='luckysheetborderSizepreview' width=100 height=10 src='' style='position:absolute;bottom:-5px;right:0px;width:100px;height:10px;'>",
            value: 'borderSize',
            example: 'more',
          },
        ]

        // itemvalue to lksticonfont
        const iconfontObject = iconfontObjects.border

        let itemset = _this.createButtonMenu(itemdata)

        let menu = replaceHtml(_this.menu, {
          id: 'border-menu',
          item: itemset,
          subclass: '',
          sub: '',
        })

        let subitemdata = [
          { text: locale_border.borderNone, value: '0', example: '' },
          {
            text:
              "<canvas type='Thin' class='border-Thin' width=" +
              canvasW +
              ' height=' +
              canvasH +
              " style='width:" +
              canvasW +
              'px;height:' +
              canvasH +
              "px;position:static;'></canvas>",
            value: '1',
            example: '',
          },
          {
            text:
              "<canvas type='Hair' class='border-Hair' width=" +
              canvasW +
              ' height=' +
              canvasH +
              " style='width:" +
              canvasW +
              'px;height:' +
              canvasH +
              "px;position:static;'></canvas>",
            value: '2',
            example: '',
          },
          {
            text:
              "<canvas type='Dotted' class='border-Dotted' width=" +
              canvasW +
              ' height=' +
              canvasH +
              " style='width:" +
              canvasW +
              'px;height:' +
              canvasH +
              "px;position:static;'></canvas>",
            value: '3',
            example: '',
          },
          {
            text:
              "<canvas type='Dashed' class='border-Dashed' width=" +
              canvasW +
              ' height=' +
              canvasH +
              " style='width:" +
              canvasW +
              'px;height:' +
              canvasH +
              "px;position:static;'></canvas>",
            value: '4',
            example: '',
          },
          {
            text:
              "<canvas type='DashDot' class='border-DashDot' width=" +
              canvasW +
              ' height=' +
              canvasH +
              " style='width:" +
              canvasW +
              'px;height:' +
              canvasH +
              "px;position:static;'></canvas>",
            value: '5',
            example: '',
          },
          {
            text:
              "<canvas type='DashDotDot' class='border-DashDotDot' width=" +
              canvasW +
              ' height=' +
              canvasH +
              " style='width:" +
              canvasW +
              'px;height:' +
              canvasH +
              "px;position:static;'></canvas>",
            value: '6',
            example: '',
          },
          // {"text":"<canvas type='Double' class='border-Double' width="+ canvasW +" height="+ canvasH +" style='width:"+ canvasW +"px;height:"+ canvasH +"px;position:static;'></canvas>", "value":"7", "example":""},
          {
            text:
              "<canvas type='Medium' class='border-Medium' width=" +
              canvasW +
              ' height=' +
              canvasH +
              " style='width:" +
              canvasW +
              'px;height:' +
              canvasH +
              "px;position:static;'></canvas>",
            value: '8',
            example: '',
          },
          {
            text:
              "<canvas type='MediumDashed' class='border-MediumDashed' width=" +
              canvasW +
              ' height=' +
              canvasH +
              " style='width:" +
              canvasW +
              'px;height:' +
              canvasH +
              "px;position:static;'></canvas>",
            value: '9',
            example: '',
          },
          {
            text:
              "<canvas type='MediumDashDot' class='border-MediumDashDot' width=" +
              canvasW +
              ' height=' +
              canvasH +
              " style='width:" +
              canvasW +
              'px;height:' +
              canvasH +
              "px;position:static;'></canvas>",
            value: '10',
            example: '',
          },
          {
            text:
              "<canvas type='MediumDashDotDot' class='border-MediumDashDotDot' width=" +
              canvasW +
              ' height=' +
              canvasH +
              " style='width:" +
              canvasW +
              'px;height:' +
              canvasH +
              "px;position:static;'></canvas>",
            value: '11',
            example: '',
          },
          // {"text":"<canvas type='SlantedDashDot' class='border-SlantedDashDot' width="+ canvasW +" height="+ canvasH +" style='width:"+ canvasW +"px;height:"+ canvasH +"px;position:static;'></canvas>", "value":"12", "example":""},
          {
            text:
              "<canvas type='Thick' class='border-Thick' width=" +
              canvasW +
              ' height=' +
              canvasH +
              " style='width:" +
              canvasW +
              'px;height:' +
              canvasH +
              "px;position:static;'></canvas>",
            value: '13',
            example: '',
          },
        ]

        let subitemset = _this.createButtonMenu(subitemdata)
        let submenu = replaceHtml(_this.menu, {
          id: 'borderSize',
          item: subitemset,
          subclass: 'luckysheet-menuButton-sub',
        })
        let submenuid = 'luckysheet-icon-borderSize-menuButton'
        let subcolormenuid = 'luckysheet-icon-borderColor-menuButton'
        let colormenu = replaceHtml(_this.color, {
          id: subcolormenuid,
          coloritem: '',
          colorself: '',
          sub: 'luckysheet-menuButton-sub',
          resetColor: locale_toolbar.resetColor,
        })

        $('body')
          .first()
          .append(menu + colormenu + submenu)
        $menuButton = $('#' + menuButtonId).width(170)
        _this.focus($menuButton, 'border-all')

        $('#' + submenuid + ' canvas').each(function (i) {
          let type = $(this).attr('type')
          let itemvalue = $(this)
            .closest('.luckysheet-cols-menuitem')
            .attr('itemvalue')
          let canvasborder = $(this)
            .addClass('luckysheet-mousedown-cancel')
            .get(0)
            .getContext('2d')
          canvasborder.translate(0.5, 0.5)

          _this.setLineDash(canvasborder, itemvalue, 'h', 0, 5, 100, 5)

          canvasborder.strokeStyle = '#000000'
          canvasborder.stroke()
          canvasborder.closePath()
        })

        $('#' + submenuid + ' .luckysheet-cols-menuitem').click(function () {
          $('#' + submenuid).hide()

          let $t = $(this),
            itemvalue = $t.attr('itemvalue')

          if (itemvalue == 0) {
            $('#luckysheetborderSizepreview')
              .attr(
                'src',
                ''
              )
              .attr('itemvalue', null)
          } else {
            let bg = $t
              .find('canvas')
              .get(0)
              .toDataURL('image/png')
            $('#luckysheetborderSizepreview')
              .attr('src', bg)
              .attr('itemvalue', itemvalue)
          }

          _this.focus($('#' + submenuid), itemvalue)
        })

        // border choose menu
        $menuButton.find('.luckysheet-cols-menuitem').click(function () {
          // *如果禁止前台编辑，则中止下一步操作
          if (!checkIsAllowEdit()) {
            tooltip.info('', locale().pivotTable.errorNotAllowEdit)
            return
          }
          $menuButton.hide()
          luckysheetContainerFocus()

          let $t = $(this),
            itemvalue = $t.attr('itemvalue')
          if (itemvalue == 'borderColor' || itemvalue == 'borderSize') {
            return
          }

          if (!checkProtectionFormatCells(Store.currentSheetIndex)) {
            return
          }

          let d = editor.deepCopyFlowData(Store.flowdata)

          let color = $('#' + subcolormenuid)
            .find('.luckysheet-color-selected')
            .val()
          let style = $('#luckysheetborderSizepreview').attr('itemvalue')

          if (color == null || color == '') {
            color = '#000'
          }

          if (style == null || style == '') {
            style = '1'
          }

          let cfg = $.extend(true, {}, Store.config)
          if (cfg['borderInfo'] == null) {
            cfg['borderInfo'] = []
          }

          let borderInfo = {
            rangeType: 'range',
            borderType: itemvalue,
            color: color,
            style: style,
            range: $.extend(true, [], Store.luckysheet_select_save),
          }

          cfg['borderInfo'].push(borderInfo)

          if (Store.clearjfundo) {
            Store.jfundo.length = 0

            let redo = []

            redo['type'] = 'borderChange'

            redo['config'] = $.extend(true, {}, Store.config)
            redo['curconfig'] = $.extend(true, {}, cfg)

            redo['sheetIndex'] = Store.currentSheetIndex

            Store.jfredo.push(redo)
          }

          server.saveParam('cg', Store.currentSheetIndex, cfg['borderInfo'], {
            k: 'borderInfo',
          })

          Store.config = cfg
          Store.luckysheetfile[getSheetIndex(Store.currentSheetIndex)].config =
            Store.config

          setTimeout(function () {
            luckysheetrefreshgrid()
          }, 1)

          $('#luckysheet-icon-border-all').attr('type', itemvalue)

          let $icon = $('#luckysheet-icon-border-all').find(
            '.luckysheet-icon-img-container'
          )

          // add lksticonfont
          $icon
            .removeAttr('class')
            .addClass(
              'luckysheet-icon-img-container luckysheet-icon-img luckysheet-icon-' +
              itemvalue +
              iconfontObject[itemvalue]
            )

          _this.focus($menuButton, itemvalue)
        })

        $('#' + subcolormenuid)
          .find('.luckysheet-color-selected')
          .spectrum({
            showPalette: true,
            showPaletteOnly: true,
            preferredFormat: 'hex',
            clickoutFiresChange: false,
            showInitial: true,
            showInput: true,
            flat: true,
            hideAfterPaletteSelect: true,
            showSelectionPalette: true,
            maxPaletteSize: 8,
            maxSelectionSize: 8,
            color: '#000',
            cancelText: locale_button.cancel,
            chooseText: locale_button.confirm,
            togglePaletteMoreText: locale_toolbar.customColor,
            togglePaletteLessText: locale_toolbar.collapse,
            togglePaletteOnly: true,
            clearText: locale_toolbar.clearText,
            noColorSelectedText: locale_toolbar.noColorSelectedText,
            localStorageKey: 'spectrum.bordercolor' + server.gridKey,
            palette: [
              [
                '#000',
                '#444',
                '#666',
                '#999',
                '#ccc',
                '#eee',
                '#f3f3f3',
                '#fff',
              ],
              ['#f00', '#f90', '#ff0', '#0f0', '#0ff', '#00f', '#90f', '#f0f'],
              [
                '#f4cccc',
                '#fce5cd',
                '#fff2cc',
                '#d9ead3',
                '#d0e0e3',
                '#cfe2f3',
                '#d9d2e9',
                '#ead1dc',
              ],
              [
                '#ea9999',
                '#f9cb9c',
                '#ffe599',
                '#b6d7a8',
                '#a2c4c9',
                '#9fc5e8',
                '#b4a7d6',
                '#d5a6bd',
              ],
              [
                '#e06666',
                '#f6b26b',
                '#ffd966',
                '#93c47d',
                '#76a5af',
                '#6fa8dc',
                '#8e7cc3',
                '#c27ba0',
              ],
              [
                '#c00',
                '#e69138',
                '#f1c232',
                '#6aa84f',
                '#45818e',
                '#3d85c6',
                '#674ea7',
                '#a64d79',
              ],
              [
                '#900',
                '#b45f06',
                '#bf9000',
                '#38761d',
                '#134f5c',
                '#0b5394',
                '#351c75',
                '#741b47',
              ],
              [
                '#600',
                '#783f04',
                '#7f6000',
                '#274e13',
                '#0c343d',
                '#073763',
                '#20124d',
                '#4c1130',
              ],
            ],
            change: function (color) {
              let $input = $(this)
              if (color != null) {
                color = color.toHexString()
              } else {
                color = '#000'
              }

              let oldcolor = null
              $('#luckysheet-icon-borderColor-linecolor').css(
                'border-bottom-color',
                color
              )
              $('#' + subcolormenuid)
                .find('.luckysheet-color-selected')
                .val(color)
            },
          })

        $('#' + subcolormenuid)
          .find('.luckysheet-color-reset')
          .click(function () {
            let $input = $('#' + subcolormenuid).find(
              '.luckysheet-color-selected'
            )
            $input.val('#000')
            $('#luckysheet-icon-cell-color').attr('color', null)
            $input.spectrum('set', '#000')
            $('#luckysheet-icon-borderColor-linecolor').css(
              'border-bottom-color',
              '#000'
            )
          })
      }

      let userlen = $(this).outerWidth()
      let tlen = $menuButton.outerWidth()

      let menuleft = $(this).offset().left
      if (
        tlen > userlen &&
        tlen + menuleft > $('#' + Store.container).width()
      ) {
        menuleft = menuleft - tlen + userlen
      }
      mouseclickposition(
        $menuButton,
        menuleft - 28,
        $(this).offset().top + 25,
        'lefttop'
      )
    })

    //合并单元格
    $('#luckysheet-icon-merge-button').click(function () {
      if (!checkProtectionNotEnable(Store.currentSheetIndex)) {
        return
      }

      if (selectIsOverlap()) {
        if (isEditMode()) {
          alert('不能合并重叠区域')
        } else {
          tooltip.info('不能合并重叠区域', '')
        }
        return
      }

      if (Store.config['merge'] != null) {
        let has_PartMC = false

        for (let s = 0; s < Store.luckysheet_select_save.length; s++) {
          let r1 = Store.luckysheet_select_save[s].row[0],
            r2 = Store.luckysheet_select_save[s].row[1]
          let c1 = Store.luckysheet_select_save[s].column[0],
            c2 = Store.luckysheet_select_save[s].column[1]

          has_PartMC = hasPartMC(Store.config, r1, r2, c1, c2)

          if (has_PartMC) {
            break
          }
        }

        if (has_PartMC) {
          if (isEditMode()) {
            alert('无法对部分合并单元格执行此操作')
          } else {
            tooltip.info('无法对部分合并单元格执行此操作', '')
          }
          return
        }
      }

      let d = editor.deepCopyFlowData(Store.flowdata)
      _this.updateFormat_mc(d, 'mergeAll')
    })

    $('#luckysheet-icon-merge-menu').click(function () {
      let menuButtonId = $(this).attr('id') + '-menuButton'
      let $menuButton = $('#' + menuButtonId)

      if ($menuButton.length == 0) {
        const _locale = locale()
        const locale_merge = _locale.merge

        let itemdata = [
          { text: locale_merge.mergeAll, value: 'mergeAll', example: '' },
          { text: locale_merge.mergeV, value: 'mergeV', example: '' },
          { text: locale_merge.mergeH, value: 'mergeH', example: '' },
          { text: locale_merge.mergeCancel, value: 'mergeCancel', example: '' },
        ]

        let itemset = _this.createButtonMenu(itemdata)

        let menu = replaceHtml(_this.menu, {
          id: 'merge-menu',
          item: itemset,
          subclass: '',
          sub: '',
        })

        $('body')
          .first()
          .append(menu)
        $menuButton = $('#' + menuButtonId)
        _this.focus($menuButton)

        $menuButton.find('.luckysheet-cols-menuitem').click(function () {
          $menuButton.hide()
          luckysheetContainerFocus()

          if (selectIsOverlap()) {
            if (isEditMode()) {
              alert(locale_merge.overlappingError)
            } else {
              tooltip.info(locale_merge.overlappingError, '')
            }
            return
          }

          if (Store.config['merge'] != null) {
            let has_PartMC = false

            for (let s = 0; s < Store.luckysheet_select_save.length; s++) {
              let r1 = Store.luckysheet_select_save[s].row[0],
                r2 = Store.luckysheet_select_save[s].row[1]
              let c1 = Store.luckysheet_select_save[s].column[0],
                c2 = Store.luckysheet_select_save[s].column[1]

              has_PartMC = hasPartMC(Store.config, r1, r2, c1, c2)

              if (has_PartMC) {
                break
              }
            }

            if (has_PartMC) {
              if (isEditMode()) {
                alert(locale_merge.partiallyError)
              } else {
                tooltip.info(locale_merge.partiallyError, '')
              }
              return
            }
          }

          let $t = $(this),
            itemvalue = $t.attr('itemvalue')
          _this.focus($menuButton, itemvalue)

          let d = editor.deepCopyFlowData(Store.flowdata)
          _this.updateFormat_mc(d, itemvalue)
        })
      }

      let userlen = $(this).outerWidth()
      let tlen = $menuButton.outerWidth()

      let menuleft = $(this).offset().left
      if (
        tlen > userlen &&
        tlen + menuleft > $('#' + Store.container).width()
      ) {
        menuleft = menuleft - tlen + userlen
      }
      mouseclickposition(
        $menuButton,
        menuleft - 28,
        $(this).offset().top + 25,
        'lefttop'
      )
    })

    //水平对齐
    $('#luckysheet-icon-align').click(function () {
      let itemvalue = $('#luckysheet-icon-align').attr('type')
      if (itemvalue == null) {
        itemvalue = 'left'
      }

      let d = editor.deepCopyFlowData(Store.flowdata)
      _this.updateFormat(d, 'ht', itemvalue)
    })

    $('#luckysheet-icon-align-menu').click(function () {
      let menuButtonId = $(this).attr('id') + '-menuButton'
      let $menuButton = $('#' + menuButtonId)

      if ($menuButton.length == 0) {
        const _locale = locale()
        const locale_align = _locale.align
        let itemdata = [
          {
            text: locale_align.left,
            value: 'left',
            example:
              '<div class="luckysheet-icon luckysheet-inline-block" style="user-select: none;opacity:1;"> <div aria-hidden="true" class="luckysheet-icon-img-container luckysheet-icon-img luckysheet-icon-align-left lksticonfont  luckysheet-lksticonfont -wenbenzuoduiqi" style="user-select: none;"> </div> </div>',
          },
          {
            text: locale_align.center,
            value: 'center',
            example:
              '<div class="luckysheet-icon luckysheet-inline-block" style="user-select: none;opacity:1;"> <div aria-hidden="true" class="luckysheet-icon-img-container luckysheet-icon-img luckysheet-icon-align-center lksticonfont  luckysheet-lksticonfont -wenbenjuzhongduiqi" style="user-select: none;"> </div> </div>',
          },
          {
            text: locale_align.right,
            value: 'right',
            example:
              '<div class="luckysheet-icon luckysheet-inline-block" style="user-select: none;opacity:1;"> <div aria-hidden="true" class="luckysheet-icon-img-container luckysheet-icon-img luckysheet-icon-align-right lksticonfont  luckysheet-lksticonfont -wenbenyouduiqi" style="user-select: none;"> </div> </div>',
          },
        ]

        // itemvalue to lksticonfont
        const iconfontObject = iconfontObjects.align

        let itemset = _this.createButtonMenu(itemdata)

        let menu = replaceHtml(_this.menu, {
          id: 'align-menu',
          item: itemset,
          subclass: '',
          sub: '',
        })

        $('body')
          .first()
          .append(menu)
        $menuButton = $('#' + menuButtonId).width(120)
        _this.focus($menuButton)

        $menuButton.find('.luckysheet-cols-menuitem').click(function () {
          $menuButton.hide()
          luckysheetContainerFocus()

          let $t = $(this),
            itemvalue = $t.attr('itemvalue')
          _this.focus($menuButton, itemvalue)

          let $icon = $('#luckysheet-icon-align')
            .attr('type', itemvalue)
            .find('.luckysheet-icon-img-container')

          // add lksticonfont
          $icon
            .removeAttr('class')
            .addClass(
              'luckysheet-icon-img-container luckysheet-icon-img luckysheet-icon-align-' +
              itemvalue +
              iconfontObject[itemvalue]
            )

          let d = editor.deepCopyFlowData(Store.flowdata)
          _this.updateFormat(d, 'ht', itemvalue)
        })
      }

      let userlen = $(this).outerWidth()
      let tlen = $menuButton.outerWidth()

      let menuleft = $(this).offset().left
      if (
        tlen > userlen &&
        tlen + menuleft > $('#' + Store.container).width()
      ) {
        menuleft = menuleft - tlen + userlen
      }
      mouseclickposition(
        $menuButton,
        menuleft - 28,
        $(this).offset().top + 25,
        'lefttop'
      )
    })

    //垂直对齐
    $('#luckysheet-icon-valign').click(function () {
      let itemvalue = $('#luckysheet-icon-valign').attr('type')
      if (itemvalue == null) {
        itemvalue = 'bottom'
      }

      let d = editor.deepCopyFlowData(Store.flowdata)
      _this.updateFormat(d, 'vt', itemvalue)
    })

    $('#luckysheet-icon-valign-menu').click(function () {
      let menuButtonId = $(this).attr('id') + '-menuButton'
      let $menuButton = $('#' + menuButtonId)
      const _locale = locale()
      const locale_align = _locale.align
      if ($menuButton.length == 0) {
        let itemdata = [
          {
            text: locale_align.top,
            value: 'top',
            example:
              '<div class="luckysheet-icon luckysheet-inline-block" style="user-select: none;opacity:1;"> <div aria-hidden="true" class="luckysheet-icon-img-container luckysheet-icon-img luckysheet-icon-valign-top lksticonfont  luckysheet-lksticonfont -dingbuduiqi" style="user-select: none;"> </div> </div>',
          },
          {
            text: locale_align.middle,
            value: 'middle',
            example:
              '<div class="luckysheet-icon luckysheet-inline-block" style="user-select: none;opacity:1;"> <div aria-hidden="true" class="luckysheet-icon-img-container luckysheet-icon-img luckysheet-icon-valign-middle lksticonfont  luckysheet-lksticonfont -shuipingduiqi" style="user-select: none;"> </div> </div>',
          },
          {
            text: locale_align.bottom,
            value: 'bottom',
            example:
              '<div class="luckysheet-icon luckysheet-inline-block" style="user-select: none;opacity:1;"> <div aria-hidden="true" class="luckysheet-icon-img-container luckysheet-icon-img luckysheet-icon-valign-bottom lksticonfont  luckysheet-lksticonfont -dibuduiqi" style="user-select: none;"> </div> </div>',
          },
        ]

        // itemvalue to lksticonfont
        const iconfontObject = iconfontObjects.align

        let itemset = _this.createButtonMenu(itemdata)

        let menu = replaceHtml(_this.menu, {
          id: 'valign-menu',
          item: itemset,
          subclass: '',
          sub: '',
        })

        $('body')
          .first()
          .append(menu)
        $menuButton = $('#' + menuButtonId).width(120)
        _this.focus($menuButton, 'bottom')

        $menuButton.find('.luckysheet-cols-menuitem').click(function () {
          $menuButton.hide()
          luckysheetContainerFocus()

          let $t = $(this),
            itemvalue = $t.attr('itemvalue')
          _this.focus($menuButton, itemvalue)

          let $icon = $('#luckysheet-icon-valign')
            .attr('type', itemvalue)
            .find('.luckysheet-icon-img-container')

          // add lksticonfont
          $icon
            .removeAttr('class')
            .addClass(
              'luckysheet-icon-img-container luckysheet-icon-img luckysheet-icon-valign-' +
              itemvalue +
              iconfontObject[itemvalue]
            )

          let d = editor.deepCopyFlowData(Store.flowdata)
          _this.updateFormat(d, 'vt', itemvalue)
        })
      }

      let userlen = $(this).outerWidth()
      let tlen = $menuButton.outerWidth()

      let menuleft = $(this).offset().left
      if (
        tlen > userlen &&
        tlen + menuleft > $('#' + Store.container).width()
      ) {
        menuleft = menuleft - tlen + userlen
      }
      mouseclickposition(
        $menuButton,
        menuleft - 28,
        $(this).offset().top + 25,
        'lefttop'
      )
    })

    //文本换行
    $('#luckysheet-icon-textwrap-menu').click(function () {
      let menuButtonId = $(this).attr('id') + '-menuButton'
      let $menuButton = $('#' + menuButtonId)

      if ($menuButton.length == 0) {
        const _locale = locale()
        const locale_textWrap = _locale.textWrap
        let itemdata = [
          {
            text: locale_textWrap.overflow,
            value: 'overflow',
            example:
              '<div class="luckysheet-icon luckysheet-inline-block" style="user-select: none;opacity:1;"> <div aria-hidden="true" class="luckysheet-icon-img-container luckysheet-icon-img luckysheet-icon-textwrap-overflow lksticonfont  luckysheet-lksticonfont -yichu1" style="user-select: none;"> </div> </div>',
          },
          {
            text: locale_textWrap.wrap,
            value: 'wrap',
            example:
              '<div class="luckysheet-icon luckysheet-inline-block" style="user-select: none;opacity:1;"> <div aria-hidden="true" class="luckysheet-icon-img-container luckysheet-icon-img luckysheet-icon-textwrap-wrap lksticonfont  luckysheet-lksticonfont -zidonghuanhang" style="user-select: none;"> </div> </div>',
          },
          {
            text: locale_textWrap.clip,
            value: 'clip',
            example:
              '<div class="luckysheet-icon luckysheet-inline-block" style="user-select: none;opacity:1;"> <div aria-hidden="true" class="luckysheet-icon-img-container luckysheet-icon-img luckysheet-icon-textwrap-clip lksticonfont  luckysheet-lksticonfont -jieduan" style="user-select: none;"> </div> </div>',
          },
        ]

        // itemvalue to lksticonfont
        const iconfontObject = iconfontObjects.textWrap

        let itemset = _this.createButtonMenu(itemdata)

        let menu = replaceHtml(_this.menu, {
          id: 'textwrap-menu',
          item: itemset,
          subclass: '',
          sub: '',
        })

        $('body')
          .first()
          .append(menu)
        $menuButton = $('#' + menuButtonId).width(120)
        _this.focus($menuButton, 'clip')

        $menuButton.find('.luckysheet-cols-menuitem').click(function () {
          $menuButton.hide()
          luckysheetContainerFocus()

          let $t = $(this),
            itemvalue = $t.attr('itemvalue')
          _this.focus($menuButton, itemvalue)

          let $icon = $('#luckysheet-icon-textwrap')
            .attr('type', itemvalue)
            .find('.luckysheet-icon-img-container')

          // add lksticonfont
          $icon
            .removeAttr('class')
            .addClass(
              'luckysheet-icon-img-container luckysheet-icon-img luckysheet-icon-textwrap-' +
              itemvalue +
              iconfontObject[itemvalue]
            )

          let d = editor.deepCopyFlowData(Store.flowdata)
          _this.updateFormat(d, 'tb', itemvalue)
        })
      }

      let userlen = $(this).outerWidth()
      let tlen = $menuButton.outerWidth()

      let menuleft = $(this).offset().left
      if (
        tlen > userlen &&
        tlen + menuleft > $('#' + Store.container).width()
      ) {
        menuleft = menuleft - tlen + userlen
      }
      mouseclickposition(
        $menuButton,
        menuleft - 28,
        $(this).offset().top + 25,
        'lefttop'
      )
    })

    //文本旋转
    $('#luckysheet-icon-rotation-menu').click(function () {
      let menuButtonId = $(this).attr('id') + '-menuButton'
      let $menuButton = $('#' + menuButtonId)

      if ($menuButton.length == 0) {
        const _locale = locale()
        const locale_rotation = _locale.rotation
        let itemdata = [
          {
            text: locale_rotation.none,
            value: 'none',
            example:
              '<div class="luckysheet-icon luckysheet-inline-block" style="user-select: none;opacity:1;"> <div aria-hidden="true" class="luckysheet-icon-img-container luckysheet-icon-img luckysheet-icon-rotation-none lksticonfont  luckysheet-lksticonfont -wuxuanzhuang" style="user-select: none;"> </div> </div>',
          },
          {
            text: locale_rotation.angleup,
            value: 'angleup',
            example:
              '<div class="luckysheet-icon luckysheet-inline-block" style="user-select: none;opacity:1;"> <div aria-hidden="true" class="luckysheet-icon-img-container luckysheet-icon-img luckysheet-icon-rotation-angleup lksticonfont  luckysheet-lksticonfont -xiangshangqingxie" style="user-select: none;"> </div> </div>',
          },
          {
            text: locale_rotation.angledown,
            value: 'angledown',
            example:
              '<div class="luckysheet-icon luckysheet-inline-block" style="user-select: none;opacity:1;"> <div aria-hidden="true" class="luckysheet-icon-img-container luckysheet-icon-img luckysheet-icon-rotation-angledown lksticonfont  luckysheet-lksticonfont -xiangxiaqingxie" style="user-select: none;"> </div> </div>',
          },
          {
            text: locale_rotation.vertical,
            value: 'vertical',
            example:
              '<div class="luckysheet-icon luckysheet-inline-block" style="user-select: none;opacity:1;"> <div aria-hidden="true" class="luckysheet-icon-img-container luckysheet-icon-img luckysheet-icon-rotation-vertical lksticonfont  luckysheet-lksticonfont -shupaiwenzi" style="user-select: none;"> </div> </div>',
          },
          {
            text: locale_rotation.rotationUp,
            value: 'rotation-up',
            example:
              '<div class="luckysheet-icon luckysheet-inline-block" style="user-select: none;opacity:1;"> <div aria-hidden="true" class="luckysheet-icon-img-container luckysheet-icon-img luckysheet-icon-rotation-rotation-up lksticonfont  luckysheet-lksticonfont -wenbenxiangshang" style="user-select: none;"> </div> </div>',
          },
          {
            text: locale_rotation.rotationDown,
            value: 'rotation-down',
            example:
              '<div class="luckysheet-icon luckysheet-inline-block" style="user-select: none;opacity:1;"> <div aria-hidden="true" class="luckysheet-icon-img-container luckysheet-icon-img luckysheet-icon-rotation-rotation-down lksticonfont  luckysheet-lksticonfont -xiangxia90" style="user-select: none;"> </div> </div>',
          },
        ]

        // itemvalue to lksticonfont
        const iconfontObject = iconfontObjects.rotation

        let itemset = _this.createButtonMenu(itemdata)

        let menu = replaceHtml(_this.menu, {
          id: 'rotation-menu',
          item: itemset,
          subclass: '',
          sub: '',
        })

        $('body')
          .first()
          .append(menu)

        // 文字旋转总 Stack Vertically 太长了，拉宽到160
        $menuButton = $('#' + menuButtonId).width(160)
        _this.focus($menuButton)

        $menuButton.find('.luckysheet-cols-menuitem').click(function () {
          $menuButton.hide()
          luckysheetContainerFocus()

          let $t = $(this),
            itemvalue = $t.attr('itemvalue')
          _this.focus($menuButton, itemvalue)

          let $icon = $('#luckysheet-icon-rotation')
            .attr('type', itemvalue)
            .find('.luckysheet-icon-img-container')

          // add lksticonfont
          $icon
            .removeAttr('class')
            .addClass(
              'luckysheet-icon-img-container luckysheet-icon-img luckysheet-icon-rotation-' +
              itemvalue +
              iconfontObject[itemvalue]
            )

          let d = editor.deepCopyFlowData(Store.flowdata)
          _this.updateFormat(d, 'tr', itemvalue)
        })
      }

      let userlen = $(this).outerWidth()
      let tlen = $menuButton.outerWidth()

      let menuleft = $(this).offset().left
      if (
        tlen > userlen &&
        tlen + menuleft > $('#' + Store.container).width()
      ) {
        menuleft = menuleft - tlen + userlen
      }
      mouseclickposition(
        $menuButton,
        menuleft - 28,
        $(this).offset().top + 25,
        'lefttop'
      )
    })

    //冻结行列
    $('#luckysheet-icon-freezen-menu').click(function () {
      let menuButtonId = $(this).attr('id') + '-menuButton'
      let $menuButton = $('#' + menuButtonId)

      if ($menuButton.length == 0) {
        const _locale = locale()
        const locale_freezen = _locale.freezen
        let itemdata = [
          { text: locale_freezen.freezenRow, value: 'freezenRow', example: '' },
          {
            text: locale_freezen.freezenColumn,
            value: 'freezenColumn',
            example: '',
          },
          { text: locale_freezen.freezenRC, value: 'freezenRC', example: '' },
          { text: '', value: 'split', example: '' },
          {
            text: locale_freezen.freezenRowRange,
            value: 'freezenRowRange',
            example: '',
          },
          {
            text: locale_freezen.freezenColumnRange,
            value: 'freezenColumnRange',
            example: '',
          },
          {
            text: locale_freezen.freezenRCRange,
            value: 'freezenRCRange',
            example: '',
          },
          { text: '', value: 'split', example: '' },
          {
            text: locale_freezen.freezenCancel,
            value: 'freezenCancel',
            example: '',
          },
        ]

        let itemset = _this.createButtonMenu(itemdata)

        let menu = replaceHtml(_this.menu, {
          id: 'freezen-menu',
          item: itemset,
          subclass: '',
          sub: '',
        })

        $('body')
          .first()
          .append(menu)
        $menuButton = $('#' + menuButtonId).width(170)

        $menuButton.find('.luckysheet-cols-menuitem').click(function () {
          $menuButton.hide()
          luckysheetContainerFocus()

          let $t = $(this),
            itemvalue = $t.attr('itemvalue')
          _this.focus($menuButton, itemvalue)
          if (itemvalue === 'freezenCancel') {
            $menuButton.find('.fa.fa-check').remove()
          }

          // store frozen
          luckysheetFreezen.saveFrozen(itemvalue)

          if (itemvalue == 'freezenRow') {
            //首行冻结
            frozenFirstRow()
            // let scrollTop = $("#luckysheet-cell-main").scrollTop();
            // let row_st = luckysheet_searcharray(Store.visibledatarow, scrollTop);
            // if(row_st == -1){
            //     row_st = 0;
            // }
            // let top = Store.visibledatarow[row_st] - 2 - scrollTop + Store.columnHeaderHeight;
            // let freezenhorizontaldata = [Store.visibledatarow[row_st], row_st + 1, scrollTop, luckysheetFreezen.cutVolumn(Store.visibledatarow, row_st + 1), top];
            // luckysheetFreezen.saveFreezen(freezenhorizontaldata, top, null, null);

            // if (luckysheetFreezen.freezenverticaldata != null) {
            //     luckysheetFreezen.cancelFreezenVertical();
            //     luckysheetFreezen.createAssistCanvas();
            //     luckysheetrefreshgrid();
            // }

            // luckysheetFreezen.createFreezenHorizontal(freezenhorizontaldata, top);
            // luckysheetFreezen.createAssistCanvas();
            // luckysheetrefreshgrid();
          } else if (itemvalue == 'freezenColumn') {
            //首列冻结
            frozenFirstColumn()
            // let scrollLeft = $("#luckysheet-cell-main").scrollLeft();
            // let col_st = luckysheet_searcharray(Store.visibledatacolumn, scrollLeft);
            // if(col_st == -1){
            //     col_st = 0;
            // }
            // let left = Store.visibledatacolumn[col_st] - 2 - scrollLeft + Store.rowHeaderWidth;
            // let freezenverticaldata = [Store.visibledatacolumn[col_st], col_st + 1, scrollLeft, luckysheetFreezen.cutVolumn(Store.visibledatacolumn, col_st + 1), left];
            // luckysheetFreezen.saveFreezen(null, null, freezenverticaldata, left);

            // if (luckysheetFreezen.freezenhorizontaldata != null) {
            //     luckysheetFreezen.cancelFreezenHorizontal();
            //     luckysheetFreezen.createAssistCanvas();
            //     luckysheetrefreshgrid();
            // }

            // luckysheetFreezen.createFreezenVertical(freezenverticaldata, left);
            // luckysheetFreezen.createAssistCanvas();
            // luckysheetrefreshgrid();
          } else if (itemvalue == 'freezenRC') {
            //首行列冻结
            if (luckysheetFreezen.freezenRealFirstRowColumn) {
              let row_st = 0
              let top =
                Store.visibledatarow[row_st] - 2 + Store.columnHeaderHeight
              let freezenhorizontaldata = [
                Store.visibledatarow[row_st],
                row_st + 1,
                0,
                luckysheetFreezen.cutVolumn(Store.visibledatarow, row_st + 1),
                top,
              ]
              luckysheetFreezen.saveFreezen(
                freezenhorizontaldata,
                top,
                null,
                null
              )

              luckysheetFreezen.createFreezenHorizontal(
                freezenhorizontaldata,
                top
              )

              let col_st = 0
              let left =
                Store.visibledatacolumn[col_st] - 2 + Store.rowHeaderWidth
              let freezenverticaldata = [
                Store.visibledatacolumn[col_st],
                col_st + 1,
                0,
                luckysheetFreezen.cutVolumn(
                  Store.visibledatacolumn,
                  col_st + 1
                ),
                left,
              ]
              luckysheetFreezen.saveFreezen(
                null,
                null,
                freezenverticaldata,
                left
              )

              luckysheetFreezen.createFreezenVertical(freezenverticaldata, left)
            } else {
              let scrollTop = $('#luckysheet-cell-main').scrollTop()
              let row_st = luckysheet_searcharray(
                Store.visibledatarow,
                scrollTop
              )
              if (row_st == -1) {
                row_st = 0
              }
              let top =
                Store.visibledatarow[row_st] -
                2 -
                scrollTop +
                Store.columnHeaderHeight
              let freezenhorizontaldata = [
                Store.visibledatarow[row_st],
                row_st + 1,
                scrollTop,
                luckysheetFreezen.cutVolumn(Store.visibledatarow, row_st + 1),
                top,
              ]
              luckysheetFreezen.saveFreezen(
                freezenhorizontaldata,
                top,
                null,
                null
              )

              luckysheetFreezen.createFreezenHorizontal(
                freezenhorizontaldata,
                top
              )

              let scrollLeft = $('#luckysheet-cell-main').scrollLeft()
              let col_st = luckysheet_searcharray(
                Store.visibledatacolumn,
                scrollLeft
              )
              if (col_st == -1) {
                col_st = 0
              }
              let left =
                Store.visibledatacolumn[col_st] -
                2 -
                scrollLeft +
                Store.rowHeaderWidth
              let freezenverticaldata = [
                Store.visibledatacolumn[col_st],
                col_st + 1,
                scrollLeft,
                luckysheetFreezen.cutVolumn(
                  Store.visibledatacolumn,
                  col_st + 1
                ),
                left,
              ]
              luckysheetFreezen.saveFreezen(
                null,
                null,
                freezenverticaldata,
                left
              )

              luckysheetFreezen.createFreezenVertical(freezenverticaldata, left)
            }
            luckysheetFreezen.createAssistCanvas()
            luckysheetrefreshgrid()
          } else if (itemvalue == 'freezenRowRange') {
            //选区行冻结

            if (
              Store.luckysheet_select_save == null ||
              Store.luckysheet_select_save.length == 0
            ) {
              if (isEditMode()) {
                alert(locale_freezen.noSeletionError)
              } else {
                tooltip.info(locale_freezen.noSeletionError, '')
              }

              return
            }
            // 固定超出屏幕范围
            let rangeTop =
              Store.luckysheet_select_save[
                Store.luckysheet_select_save.length - 1
              ].top
            if (
              luckysheetFreezen.freezenRealFirstRowColumn &&
              rangeTop > $('#luckysheet-cell-main').height()
            ) {
              return tooltip.info(
                locale_freezen.rangeRCOverErrorTitle,
                locale_freezen.rangeRCOverError
              )
            }
            let scrollTop = $('#luckysheet-cell-main').scrollTop()
            let row_st = luckysheet_searcharray(Store.visibledatarow, scrollTop)

            let last =
              Store.luckysheet_select_save[
              Store.luckysheet_select_save.length - 1
              ]
            let row_focus =
              last['row_focus'] == null ? last['row'][0] : last['row_focus']

            if (row_focus > row_st) {
              row_st = row_focus
            }

            if (row_st == -1) {
              row_st = 0
            }
            let top, freezenhorizontaldata
            if (luckysheetFreezen.freezenRealFirstRowColumn) {
              top = Store.visibledatarow[row_st] - 2 + Store.columnHeaderHeight
              freezenhorizontaldata = [
                Store.visibledatarow[row_st],
                row_st + 1,
                0,
                luckysheetFreezen.cutVolumn(Store.visibledatarow, row_st + 1),
                top,
              ]
            } else {
              top =
                Store.visibledatarow[row_st] -
                2 -
                scrollTop +
                Store.columnHeaderHeight
              freezenhorizontaldata = [
                Store.visibledatarow[row_st],
                row_st + 1,
                scrollTop,
                luckysheetFreezen.cutVolumn(Store.visibledatarow, row_st + 1),
                top,
              ]
            }
            luckysheetFreezen.saveFreezen(
              freezenhorizontaldata,
              top,
              null,
              null
            )

            if (luckysheetFreezen.freezenverticaldata != null) {
              luckysheetFreezen.cancelFreezenVertical()
              luckysheetFreezen.createAssistCanvas()
              luckysheetrefreshgrid()
            }

            luckysheetFreezen.createFreezenHorizontal(
              freezenhorizontaldata,
              top
            )
            luckysheetFreezen.createAssistCanvas()
            luckysheetrefreshgrid()
          } else if (itemvalue == 'freezenColumnRange') {
            //选区列冻结
            if (
              Store.luckysheet_select_save == null ||
              Store.luckysheet_select_save.length == 0
            ) {
              if (isEditMode()) {
                alert(locale_freezen.noSeletionError)
              } else {
                tooltip.info(locale_freezen.noSeletionError, '')
              }

              return
            }
            // 固定超出屏幕范围
            let rangeLeft =
              Store.luckysheet_select_save[
                Store.luckysheet_select_save.length - 1
              ].left
            if (
              luckysheetFreezen.freezenRealFirstRowColumn &&
              rangeLeft > $('#luckysheet-cell-main').width()
            ) {
              return tooltip.info(
                locale_freezen.rangeRCOverErrorTitle,
                locale_freezen.rangeRCOverError
              )
            }
            let scrollLeft = $('#luckysheet-cell-main').scrollLeft()
            let col_st = luckysheet_searcharray(
              Store.visibledatacolumn,
              scrollLeft
            )

            let last =
              Store.luckysheet_select_save[
              Store.luckysheet_select_save.length - 1
              ]
            let column_focus =
              last['column_focus'] == null
                ? last['column'][0]
                : last['column_focus']

            if (column_focus > col_st) {
              col_st = column_focus
            }

            if (col_st == -1) {
              col_st = 0
            }
            let left, freezenverticaldata
            if (luckysheetFreezen.freezenRealFirstRowColumn) {
              left = Store.visibledatacolumn[col_st] - 2 + Store.rowHeaderWidth
              freezenverticaldata = [
                Store.visibledatacolumn[col_st],
                col_st + 1,
                0,
                luckysheetFreezen.cutVolumn(
                  Store.visibledatacolumn,
                  col_st + 1
                ),
                left,
              ]
            } else {
              left =
                Store.visibledatacolumn[col_st] -
                2 -
                scrollLeft +
                Store.rowHeaderWidth
              freezenverticaldata = [
                Store.visibledatacolumn[col_st],
                col_st + 1,
                scrollLeft,
                luckysheetFreezen.cutVolumn(
                  Store.visibledatacolumn,
                  col_st + 1
                ),
                left,
              ]
            }
            luckysheetFreezen.saveFreezen(null, null, freezenverticaldata, left)

            if (luckysheetFreezen.freezenhorizontaldata != null) {
              luckysheetFreezen.cancelFreezenHorizontal()
              luckysheetFreezen.createAssistCanvas()
              luckysheetrefreshgrid()
            }

            luckysheetFreezen.createFreezenVertical(freezenverticaldata, left)
            luckysheetFreezen.createAssistCanvas()
            luckysheetrefreshgrid()
          } else if (itemvalue == 'freezenRCRange') {
            //选区行列冻结
            if (
              Store.luckysheet_select_save == null ||
              Store.luckysheet_select_save.length == 0
            ) {
              if (isEditMode()) {
                alert(locale_freezen.noSeletionError)
              } else {
                tooltip.info(locale_freezen.noSeletionError, '')
              }

              return
            }

            // 固定超出屏幕范围
            let rangeTop =
              Store.luckysheet_select_save[
                Store.luckysheet_select_save.length - 1
              ].top
            let rangeLeft =
              Store.luckysheet_select_save[
                Store.luckysheet_select_save.length - 1
              ].left
            if (
              luckysheetFreezen.freezenRealFirstRowColumn &&
              (rangeTop > $('#luckysheet-cell-main').height() ||
                rangeLeft > $('#luckysheet-cell-main').width())
            ) {
              return tooltip.info(
                locale_freezen.rangeRCOverErrorTitle,
                locale_freezen.rangeRCOverError
              )
            }

            let scrollTop = $('#luckysheet-cell-main').scrollTop()
            let row_st = luckysheet_searcharray(Store.visibledatarow, scrollTop)

            let last =
              Store.luckysheet_select_save[
              Store.luckysheet_select_save.length - 1
              ]
            let row_focus =
              last['row_focus'] == null ? last['row'][0] : last['row_focus']

            if (row_focus > row_st) {
              row_st = row_focus
            }

            if (row_st == -1) {
              row_st = 0
            }
            let top, freezenhorizontaldata
            if (luckysheetFreezen.freezenRealFirstRowColumn) {
              top = Store.visibledatarow[row_st] - 2 + Store.columnHeaderHeight
              freezenhorizontaldata = [
                Store.visibledatarow[row_st],
                row_st + 1,
                0,
                luckysheetFreezen.cutVolumn(Store.visibledatarow, row_st + 1),
                top,
              ]
              luckysheetFreezen.saveFreezen(
                freezenhorizontaldata,
                top,
                null,
                null
              )
            } else {
              top =
                Store.visibledatarow[row_st] -
                2 -
                scrollTop +
                Store.columnHeaderHeight
              freezenhorizontaldata = [
                Store.visibledatarow[row_st],
                row_st + 1,
                scrollTop,
                luckysheetFreezen.cutVolumn(Store.visibledatarow, row_st + 1),
                top,
              ]
              luckysheetFreezen.saveFreezen(
                freezenhorizontaldata,
                top,
                null,
                null
              )
            }

            luckysheetFreezen.createFreezenHorizontal(
              freezenhorizontaldata,
              top
            )

            let scrollLeft = $('#luckysheet-cell-main').scrollLeft()
            let col_st = luckysheet_searcharray(
              Store.visibledatacolumn,
              scrollLeft
            )

            let column_focus =
              last['column_focus'] == null
                ? last['column'][0]
                : last['column_focus']

            if (column_focus > col_st) {
              col_st = column_focus
            }

            if (col_st == -1) {
              col_st = 0
            }
            let left, freezenverticaldata
            if (luckysheetFreezen.freezenRealFirstRowColumn) {
              left = Store.visibledatacolumn[col_st] - 2 + Store.rowHeaderWidth
              freezenverticaldata = [
                Store.visibledatacolumn[col_st],
                col_st + 1,
                0,
                luckysheetFreezen.cutVolumn(
                  Store.visibledatacolumn,
                  col_st + 1
                ),
                left,
              ]
            } else {
              left =
                Store.visibledatacolumn[col_st] -
                2 -
                scrollLeft +
                Store.rowHeaderWidth
              freezenverticaldata = [
                Store.visibledatacolumn[col_st],
                col_st + 1,
                scrollLeft,
                luckysheetFreezen.cutVolumn(
                  Store.visibledatacolumn,
                  col_st + 1
                ),
                left,
              ]
            }
            luckysheetFreezen.saveFreezen(null, null, freezenverticaldata, left)

            luckysheetFreezen.createFreezenVertical(freezenverticaldata, left)

            luckysheetFreezen.createAssistCanvas()
            luckysheetrefreshgrid()
          } else if (itemvalue == 'freezenCancel') {
            //Cancel freezen
            if (luckysheetFreezen.freezenverticaldata != null) {
              luckysheetFreezen.cancelFreezenVertical()
              luckysheetFreezen.createAssistCanvas()
              luckysheetrefreshgrid()
            }

            if (luckysheetFreezen.freezenhorizontaldata != null) {
              luckysheetFreezen.cancelFreezenHorizontal()
              luckysheetFreezen.createAssistCanvas()
              luckysheetrefreshgrid()
            }

            luckysheetFreezen.scrollAdapt()
          }

          setTimeout(function () {
            luckysheetsizeauto()
          }, 0)
        })
      }

      let userlen = $(this).outerWidth()
      let tlen = $menuButton.outerWidth()

      let menuleft = $(this).offset().left
      if (
        tlen > userlen &&
        tlen + menuleft > $('#' + Store.container).width()
      ) {
        menuleft = menuleft - tlen + userlen
      }
      mouseclickposition(
        $menuButton,
        menuleft - 68,
        $(this).offset().top + 25,
        'lefttop'
      )
    })

    //过滤和排序
    $('#luckysheet-icon-autofilter').click(function () {
      let menuButtonId = $(this).attr('id') + '-menuButton'
      let $menuButton = $('#' + menuButtonId)

      if ($menuButton.length == 0) {
        const _locale = locale()
        const locale_sort = _locale.sort
        const locale_filter = _locale.filter
        let itemdata = [
          {
            text: locale_sort.asc,
            value: 'asc',
            example:
              '<i class="lksticonfont  luckysheet-lksticonfont -shengxu" aria-hidden="true"></i>',
          },
          {
            text: locale_sort.desc,
            value: 'desc',
            example:
              '<i class="lksticonfont  luckysheet-lksticonfont -jiangxu" aria-hidden="true"></i>',
          },
          {
            text: locale_sort.custom + '...',
            value: 'diysort',
            example:
              '<i class="lksticonfont  luckysheet-lksticonfont -zidingyipaixu" aria-hidden="true"></i>',
          },
          { text: '', value: 'split', example: '' },
          {
            text: locale_filter.filter,
            value: 'filter',
            example:
              '<i class="lksticonfont  luckysheet-lksticonfont -shaixuan2" aria-hidden="true"></i>',
          },
          {
            text: locale_filter.clearFilter,
            value: 'clearfilter',
            example:
              '<i class="lksticonfont  luckysheet-lksticonfont -qingchushaixuan" aria-hidden="true"></i>',
          },
        ]

        let itemset = _this.createButtonMenu(itemdata)

        let menu = replaceHtml(_this.menu, {
          id: 'autofilter',
          item: itemset,
          subclass: '',
          sub: '',
        })

        $('body')
          .first()
          .append(menu)
        $menuButton = $('#' + menuButtonId).width(150)

        $menuButton.find('.luckysheet-cols-menuitem').click(function () {
          $menuButton.hide()
          luckysheetContainerFocus()

          let $t = $(this),
            itemvalue = $t.attr('itemvalue')

          if (itemvalue == 'diysort') {
            $('#luckysheetorderby').click()
          } else if (itemvalue == 'asc') {
            sortSelection(true)
          } else if (itemvalue == 'desc') {
            sortSelection(false)
          } else if (itemvalue == 'filter') {
            if (
              $('#luckysheet-filter-options-sheet' + Store.currentSheetIndex)
                .length > 0
            ) {
              $('#luckysheet-filter-initial').click()
            } else {
              createFilter()
            }
          } else if (itemvalue == 'clearfilter') {
            $('#luckysheet-filter-initial').click()
          }
        })
      }

      let userlen = $(this).outerWidth()
      let tlen = $menuButton.outerWidth()

      let menuleft = $(this).offset().left
      if (
        tlen > userlen &&
        tlen + menuleft > $('#' + Store.container).width()
      ) {
        menuleft = menuleft - tlen + userlen
      }
      mouseclickposition(
        $menuButton,
        menuleft,
        $(this).offset().top + 25,
        'lefttop'
      )
    })

    //查找和替换
    $('#luckysheet-icon-seachmore').click(function () {
      let menuButtonId = $(this).attr('id') + '-menuButton'
      let $menuButton = $('#' + menuButtonId)
      const _locale = locale()
      const locale_findAndReplace = _locale.findAndReplace
      if ($menuButton.length == 0) {
        let itemdata = [
          {
            text: locale_findAndReplace.find + ' ...',
            value: 'search',
            example:
              '<i class="lksticonfont  luckysheet-lksticonfont -sousuo" aria-hidden="true"></i>',
          },
          {
            text: locale_findAndReplace.replace + ' ...',
            value: 'replace',
            example:
              '<i class="lksticonfont  luckysheet-lksticonfont -tihuan" aria-hidden="true"></i>',
          },
          // {"text": locale_findAndReplace.goto+" ...", "value": "goto", "example": '<i class="lksticonfont  luckysheet-lksticonfont -zhuandao1" aria-hidden="true"></i>'},
          { text: '', value: 'split', example: '' },
          {
            text: locale_findAndReplace.location + ' ...',
            value: 'location',
            example:
              '<i class="lksticonfont  luckysheet-lksticonfont -dingwei" aria-hidden="true"></i>',
          },
          {
            text: locale_findAndReplace.formula,
            value: 'locationFormula',
            example: locale_findAndReplace.locationExample,
          },
          {
            text: locale_findAndReplace.date,
            value: 'locationConstantDate',
            example: locale_findAndReplace.locationExample,
          },
          {
            text: locale_findAndReplace.number,
            value: 'locationConstantNumber',
            example: locale_findAndReplace.locationExample,
          },
          {
            text: locale_findAndReplace.string,
            value: 'locationConstantString',
            example: locale_findAndReplace.locationExample,
          },
          {
            text: locale_findAndReplace.error,
            value: 'locationConstantError',
            example: locale_findAndReplace.locationExample,
          },
          {
            text: locale_findAndReplace.condition,
            value: 'locationCF',
            example: locale_findAndReplace.locationExample,
          },
          {
            text: locale_findAndReplace.rowSpan,
            value: 'locationStepRow',
            example: locale_findAndReplace.locationExample,
          },
          {
            text: locale_findAndReplace.columnSpan,
            value: 'locationStepColumn',
            example: locale_findAndReplace.locationExample,
          },
        ]

        let itemset = _this.createButtonMenu(itemdata)

        let menu = replaceHtml(_this.menu, {
          id: 'seachmore',
          item: itemset,
          subclass: '',
          sub: '',
        })

        $('body')
          .first()
          .append(menu)
        $menuButton = $('#' + menuButtonId).width(180)

        $menuButton.find('.luckysheet-cols-menuitem').click(function () {
          $menuButton.hide()
          luckysheetContainerFocus()

          let $t = $(this),
            itemvalue = $t.attr('itemvalue')

          if (itemvalue == 'search' || itemvalue == 'replace') {
            //查找替换
            if (itemvalue == 'search') {
              luckysheetSearchReplace.createDialog(0)
            } else if (itemvalue == 'replace') {
              luckysheetSearchReplace.createDialog(1)
            }

            luckysheetSearchReplace.init()

            $('#luckysheet-search-replace #searchInput input').focus()
          } else if (itemvalue == 'location') {
            //定位条件
            luckysheetLocationCell.createDialog()
            luckysheetLocationCell.init()
          } else if (
            itemvalue == 'locationFormula' ||
            itemvalue == 'locationConstantDate' ||
            itemvalue == 'locationConstantNumber' ||
            itemvalue == 'locationConstantString' ||
            itemvalue == 'locationConstantError' ||
            itemvalue == 'locationCF'
          ) {
            let last = Store.luckysheet_select_save[0]

            let range
            if (
              Store.luckysheet_select_save.length == 0 ||
              (Store.luckysheet_select_save.length == 1 &&
                last.row[0] == last.row[1] &&
                last.column[0] == last.column[1])
            ) {
              //单个单元格
              range = [
                {
                  row: [0, Store.flowdata.length - 1],
                  column: [0, Store.flowdata[0].length - 1],
                },
              ]
            } else {
              range = $.extend(true, [], Store.luckysheet_select_save)
            }

            if (itemvalue == 'locationFormula') {
              //公式
              luckysheetLocationCell.apply(range, 'locationFormula', 'all')
            } else if (itemvalue == 'locationConstantDate') {
              //日期
              luckysheetLocationCell.apply(range, 'locationConstant', 'd')
            } else if (itemvalue == 'locationConstantNumber') {
              //数字
              luckysheetLocationCell.apply(range, 'locationConstant', 'n')
            } else if (itemvalue == 'locationConstantString') {
              //字符
              luckysheetLocationCell.apply(range, 'locationConstant', 's,g')
            } else if (itemvalue == 'locationConstantError') {
              //错误
              luckysheetLocationCell.apply(range, 'locationConstant', 'e')
            } else if (itemvalue == 'locationCF') {
              //条件格式
              luckysheetLocationCell.apply(range, 'locationCF')
            }
          } else if (itemvalue == 'locationStepRow') {
            //间隔行
            if (
              Store.luckysheet_select_save.length == 0 ||
              (Store.luckysheet_select_save.length == 1 &&
                Store.luckysheet_select_save[0].row[0] ==
                Store.luckysheet_select_save[0].row[1])
            ) {
              if (isEditMode()) {
                alert(locale_findAndReplace.lessTwoRowTip)
              } else {
                tooltip.info('', locale_findAndReplace.lessTwoRowTip)
              }
              return
            }

            let range = $.extend(true, [], Store.luckysheet_select_save)

            luckysheetLocationCell.apply(range, 'locationStepRow')
          } else if (itemvalue == 'locationStepColumn') {
            //间隔列
            if (
              Store.luckysheet_select_save.length == 0 ||
              (Store.luckysheet_select_save.length == 1 &&
                Store.luckysheet_select_save[0].column[0] ==
                Store.luckysheet_select_save[0].column[1])
            ) {
              if (isEditMode()) {
                alert(locale_findAndReplace.lessTwoColumnTip)
              } else {
                tooltip.info('', locale_findAndReplace.lessTwoColumnTip)
              }
              return
            }

            let range = $.extend(true, [], Store.luckysheet_select_save)

            luckysheetLocationCell.apply(range, 'locationStepColumn')
          }
        })
      }

      let userlen = $(this).outerWidth()
      let tlen = $menuButton.outerWidth()

      let menuleft = $(this).offset().left
      if (
        tlen > userlen &&
        tlen + menuleft > $('#' + Store.container).width()
      ) {
        menuleft = menuleft - tlen + userlen
      }
      mouseclickposition(
        $menuButton,
        menuleft,
        $(this).offset().top + 25,
        'lefttop'
      )
    })

    //公式
    $('#luckysheet-icon-function').click(function () {
      _this.autoSelectionFormula('SUM')
    })

    //公式菜单
    $('#luckysheet-icon-function-menu').click(function () {
      let menuButtonId = $(this).attr('id') + '-menuButton'
      let $menuButton = $('#' + menuButtonId)

      const _locale = locale()
      const locale_formula = _locale.formula

      if ($menuButton.length == 0) {
        let itemdata = [
          { text: locale_formula.sum, value: 'SUM', example: 'SUM' },
          {
            text: locale_formula.average,
            value: 'AVERAGE',
            example: 'AVERAGE',
          },
          { text: locale_formula.count, value: 'COUNT', example: 'COUNT' },
          { text: locale_formula.max, value: 'MAX', example: 'MAX' },
          { text: locale_formula.min, value: 'MIN', example: 'MIN' },
          { text: '', value: 'split', example: '' },
          { text: locale_formula.ifGenerate, value: 'if', example: 'IF' },
          { text: locale_formula.find + ' ...', value: 'formula', example: '' },
        ]

        let itemset = _this.createButtonMenu(itemdata)

        let menu = replaceHtml(_this.menu, {
          id: 'function-menu',
          item: itemset,
          subclass: '',
          sub: '',
        })

        $('body')
          .first()
          .append(menu)
        $menuButton = $('#' + menuButtonId).width(180)

        $menuButton.find('.luckysheet-cols-menuitem').click(function () {
          $menuButton.hide()
          luckysheetContainerFocus()

          let $t = $(this),
            itemvalue = $t.attr('itemvalue')

          if (itemvalue == 'if') {
            let last =
              Store.luckysheet_select_save[
              Store.luckysheet_select_save.length - 1
              ]
            let r =
              last['row_focus'] == null ? last['row'][0] : last['row_focus']
            let c =
              last['column_focus'] == null
                ? last['column'][0]
                : last['column_focus']

            if (
              !!Store.flowdata[r] &&
              !!Store.flowdata[r][c] &&
              !!Store.flowdata[r][c]['f']
            ) {
              let fp = Store.flowdata[r][c]['f'].toString()

              if (fp.indexOf('=if(') != -1) {
                ifFormulaGenerator.ifFormulaDialog(fp)
              } else {
                if (isEditMode()) {
                  alert(locale_formula.tipNotBelongToIf)
                } else {
                  tooltip.info(locale_formula.tipNotBelongToIf, '')
                }
                return
              }
            } else {
              ifFormulaGenerator.ifFormulaDialog()
            }

            ifFormulaGenerator.init()
          } else if (itemvalue == 'formula') {
            //点击函数查找弹出框
            if (Store.luckysheet_select_save.length == 0) {
              if (isEditMode()) {
                alert(locale_formula.tipSelectCell)
              } else {
                tooltip.info(locale_formula.tipSelectCell, '')
              }

              return
            }

            let last =
              Store.luckysheet_select_save[
              Store.luckysheet_select_save.length - 1
              ]

            let row_index = last['row_focus'],
              col_index = last['column_focus']

            luckysheetupdateCell(row_index, col_index, Store.flowdata)

            let cell = Store.flowdata[row_index][col_index]
            if (cell != null && cell.f != null) {
              //单元格有计算
              let functionStr = formula.getfunctionParam(cell.f)
              if (functionStr.fn != null) {
                //有函数公式
                insertFormula.formulaParmDialog(
                  functionStr.fn,
                  functionStr.param
                )
              } else {
                //无函数公式
                insertFormula.formulaListDialog()
              }
            } else {
              //单元格无计算
              $('#luckysheet-rich-text-editor').html(
                '<span dir="auto" class="luckysheet-formula-text-color">=</span>'
              )
              $('#luckysheet-functionbox-cell').html(
                $('#luckysheet-rich-text-editor').html()
              )
              insertFormula.formulaListDialog()
            }

            insertFormula.init()
          } else {
            _this.autoSelectionFormula(itemvalue)
          }
        })
      }

      let userlen = $(this).outerWidth()
      let tlen = $menuButton.outerWidth()

      let menuleft = $(this).offset().left
      if (
        tlen > userlen &&
        tlen + menuleft > $('#' + Store.container).width()
      ) {
        menuleft = menuleft - tlen + userlen
      }
      mouseclickposition(
        $menuButton,
        menuleft - 48,
        $(this).offset().top + 25,
        'lefttop'
      )
    })

    //加粗
    $('#luckysheet-icon-bold')
      .mousedown(function (e) {
        hideMenuByCancel(e)
        e.stopPropagation()
      })
      .click(function (e) {
        let d = editor.deepCopyFlowData(Store.flowdata)

        let flag = checkTheStatusOfTheSelectedCells('bl', 1)
        let foucsStatus = flag ? 0 : 1

        _this.updateFormat(d, 'bl', foucsStatus)
      })

    //斜体
    $('#luckysheet-icon-italic')
      .mousedown(function (e) {
        hideMenuByCancel(e)
        e.stopPropagation()
      })
      .click(function () {
        let d = editor.deepCopyFlowData(Store.flowdata)

        let flag = checkTheStatusOfTheSelectedCells('it', 1)
        let foucsStatus = flag ? 0 : 1

        _this.updateFormat(d, 'it', foucsStatus)
      })

    //删除线
    $('#luckysheet-icon-strikethrough')
      .mousedown(function (e) {
        hideMenuByCancel(e)
        e.stopPropagation()
      })
      .click(function () {
        let d = editor.deepCopyFlowData(Store.flowdata)
        let flag = checkTheStatusOfTheSelectedCells('cl', 1)
        let foucsStatus = flag ? 0 : 1

        _this.updateFormat(d, 'cl', foucsStatus)
      })

    //下划线
    $('#luckysheet-icon-underline')
      .mousedown(function (e) {
        hideMenuByCancel(e)
        e.stopPropagation()
      })
      .click(function () {
        let d = editor.deepCopyFlowData(Store.flowdata)
        let flag = checkTheStatusOfTheSelectedCells('un', 1)
        let foucsStatus = flag ? 0 : 1

        _this.updateFormat(d, 'un', foucsStatus)
      })

    //条件格式
    $('#luckysheet-icon-conditionformat').click(function () {
      let menuButtonId = $(this).attr('id') + '-menuButton'
      let $menuButton = $('#' + menuButtonId)

      const conditionformat_text = locale().conditionformat

      if ($menuButton.length == 0) {
        let itemdata = [
          {
            text: conditionformat_text.highlightCellRules,
            value: 'highlightCellRule',
            example: 'more',
          },
          {
            text: conditionformat_text.itemSelectionRules,
            value: 'projectSelectRule',
            example: 'more',
          },
          {
            text: conditionformat_text.dataBar,
            value: 'dataBar',
            example: 'more',
          },
          {
            text: conditionformat_text.colorGradation,
            value: 'colorGradation',
            example: 'more',
          },
          { text: conditionformat_text.icons, value: 'icons', example: '' },
          { text: '', value: 'split', example: '' },
          { text: conditionformat_text.newRule, value: 'newRule', example: '' },
          {
            text: conditionformat_text.deleteRule,
            value: 'deleteRule',
            example: 'more',
          },
          {
            text: conditionformat_text.manageRules,
            value: 'administerRule',
            example: '',
          },
        ]
        let itemset = _this.createButtonMenu(itemdata)
        let menu = replaceHtml(_this.menu, {
          id: 'conditionformat',
          item: itemset,
          subclass: '',
          sub: '',
        })

        //突出显示单元格规则子菜单
        let subitemdata = [
          {
            text: conditionformat_text.greaterThan,
            value: 'greaterThan',
            example: '>',
          },
          {
            text: conditionformat_text.lessThan,
            value: 'lessThan',
            example: '<',
          },
          {
            text: conditionformat_text.between,
            value: 'betweenness',
            example: '[]',
          },
          { text: conditionformat_text.equal, value: 'equal', example: '=' },
          {
            text: conditionformat_text.textContains,
            value: 'textContains',
            example: '()',
          },
          {
            text: conditionformat_text.occurrence,
            value: 'occurrenceDate',
            example: conditionformat_text.yesterday,
          },
          {
            text: conditionformat_text.duplicateValue,
            value: 'duplicateValue',
            example: '##',
          },
        ]
        let subitemset = _this.createButtonMenu(subitemdata)
        let submenu = replaceHtml(_this.menu, {
          id: 'highlightCellRule',
          item: subitemset,
          subclass: 'luckysheet-menuButton-sub',
        })

        //项目选取规则子菜单
        let subitemdata2 = [
          {
            text: conditionformat_text.top10,
            value: 'top10',
            example: conditionformat_text.top10,
          },
          {
            text: conditionformat_text.top10_percent,
            value: 'top10%',
            example: conditionformat_text.top10_percent,
          },
          {
            text: conditionformat_text.last10,
            value: 'last10',
            example: conditionformat_text.last10,
          },
          {
            text: conditionformat_text.last10_percent,
            value: 'last10%',
            example: conditionformat_text.last10_percent,
          },
          {
            text: conditionformat_text.aboveAverage,
            value: 'AboveAverage',
            example: conditionformat_text.above,
          },
          {
            text: conditionformat_text.belowAverage,
            value: 'SubAverage',
            example: conditionformat_text.below,
          },
        ]
        let subitemset2 = _this.createButtonMenu(subitemdata2)
        let submenu2 = replaceHtml(_this.menu, {
          id: 'projectSelectRule',
          item: subitemset2,
          subclass: 'luckysheet-menuButton-sub',
        })

        //数据条子菜单
        let submenu3 = `<div id="luckysheet-icon-dataBar-menuButton" class="luckysheet-cols-menu luckysheet-rightgclick-menu luckysheet-menuButton luckysheet-menuButton-sub luckysheet-mousedown-cancel" style="width: 126px;padding: 5px;top: 118.5px;left: 1321.48px;display: none;">
                                    <div itemvalue="0" class="luckysheet-cols-menuitem luckysheet-mousedown-cancel" style="width: 28px; height: 26px;padding: 5px;float: left;">
                                        <div class="luckysheet-mousedown-cancel bgImgBox" style="background-position: 0 0;" title="${conditionformat_text.gradientDataBar_1}"></div>
                                    </div>
                                    <div itemvalue="1" class="luckysheet-cols-menuitem luckysheet-mousedown-cancel" style="width: 28px; height: 26px;padding: 5px;float: left;">
                                        <div class="luckysheet-mousedown-cancel bgImgBox" style="background-position: -38px 0;" title="${conditionformat_text.gradientDataBar_2}"></div>
                                    </div>
                                    <div itemvalue="2" class="luckysheet-cols-menuitem luckysheet-mousedown-cancel" style="width: 28px; height: 26px;padding: 5px;float: left;">
                                        <div class="luckysheet-mousedown-cancel bgImgBox" style="background-position: -76px 0;" title="${conditionformat_text.gradientDataBar_3}"></div>
                                    </div>
                                    <div itemvalue="3" class="luckysheet-cols-menuitem luckysheet-mousedown-cancel" style="width: 28px; height: 26px;padding: 5px;float: left;">
                                        <div class="luckysheet-mousedown-cancel bgImgBox" style="background-position: 0 -36px;" title="${conditionformat_text.gradientDataBar_4}"></div>
                                    </div>
                                    <div itemvalue="4" class="luckysheet-cols-menuitem luckysheet-mousedown-cancel" style="width: 28px; height: 26px;padding: 5px;float: left;">
                                        <div class="luckysheet-mousedown-cancel bgImgBox" style="background-position: -38px -36px;" title="${conditionformat_text.gradientDataBar_5}"></div>
                                    </div>
                                    <div itemvalue="5" class="luckysheet-cols-menuitem luckysheet-mousedown-cancel" style="width: 28px; height: 26px;padding: 5px;float: left;">
                                        <div class="luckysheet-mousedown-cancel bgImgBox" style="background-position: -76px -36px;" title="${conditionformat_text.gradientDataBar_6}"></div>
                                    </div>
                                    <div itemvalue="6" class="luckysheet-cols-menuitem luckysheet-mousedown-cancel" style="width: 28px; height: 26px;padding: 5px;float: left;">
                                        <div class="luckysheet-mousedown-cancel bgImgBox" style="background-position: 0 -72px;" title="${conditionformat_text.solidColorDataBar_1}"></div>
                                    </div>
                                    <div itemvalue="7" class="luckysheet-cols-menuitem luckysheet-mousedown-cancel" style="width: 28px; height: 26px;padding: 5px;float: left;">
                                        <div class="luckysheet-mousedown-cancel bgImgBox" style="background-position: -38px -72px;" title="${conditionformat_text.solidColorDataBar_2}"></div>
                                    </div>
                                    <div itemvalue="8" class="luckysheet-cols-menuitem luckysheet-mousedown-cancel" style="width: 28px; height: 26px;padding: 5px;float: left;">
                                        <div class="luckysheet-mousedown-cancel bgImgBox" style="background-position: -76px -72px;" title="${conditionformat_text.solidColorDataBar_3}"></div>
                                    </div>
                                    <div itemvalue="9" class="luckysheet-cols-menuitem luckysheet-mousedown-cancel" style="width: 28px; height: 26px;padding: 5px;float: left;">
                                        <div class="luckysheet-mousedown-cancel bgImgBox" style="background-position: 0 -108px;" title="${conditionformat_text.solidColorDataBar_4}"></div>
                                    </div>
                                    <div itemvalue="10" class="luckysheet-cols-menuitem luckysheet-mousedown-cancel" style="width: 28px; height: 26px;padding: 5px;float: left;">
                                        <div class="luckysheet-mousedown-cancel bgImgBox" style="background-position: -38px -108px;" title="${conditionformat_text.solidColorDataBar_5}"></div>
                                    </div>
                                    <div itemvalue="11" class="luckysheet-cols-menuitem luckysheet-mousedown-cancel" style="width: 28px; height: 26px;padding: 5px;float: left;">
                                        <div class="luckysheet-mousedown-cancel bgImgBox" style="background-position: -76px -108px;" title="${conditionformat_text.solidColorDataBar_6}"></div>
                                    </div>
                                </div>`

        //色阶
        let submenu4 = `<div id="luckysheet-icon-colorGradation-menuButton" class="luckysheet-cols-menu luckysheet-rightgclick-menu luckysheet-menuButton luckysheet-menuButton-sub luckysheet-mousedown-cancel" style="width: 126px;padding: 5px;top: 143.5px;left: 1321.48px;display: none;">
                                    <div itemvalue="0" class="luckysheet-cols-menuitem luckysheet-mousedown-cancel" style="width: 28px; height: 26px;padding: 5px;float: left;">
                                        <div class="luckysheet-mousedown-cancel bgImgBox" style="background-position: 0 0;" title="${conditionformat_text.colorGradation_1}"></div>
                                    </div>
                                    <div itemvalue="1" class="luckysheet-cols-menuitem luckysheet-mousedown-cancel" style="width: 28px; height: 26px;padding: 5px;float: left;">
                                        <div class="luckysheet-mousedown-cancel bgImgBox" style="background-position: -38px 0;" title="${conditionformat_text.colorGradation_2}"></div>
                                    </div>
                                    <div itemvalue="2" class="luckysheet-cols-menuitem luckysheet-mousedown-cancel" style="width: 28px; height: 26px;padding: 5px;float: left;">
                                        <div class="luckysheet-mousedown-cancel bgImgBox" style="background-position: -76px 0;" title="${conditionformat_text.colorGradation_3}"></div>
                                    </div>
                                    <div itemvalue="3" class="luckysheet-cols-menuitem luckysheet-mousedown-cancel" style="width: 28px; height: 26px;padding: 5px;float: left;">
                                        <div class="luckysheet-mousedown-cancel bgImgBox" style="background-position: -114px 0;" title="${conditionformat_text.colorGradation_4}"></div>
                                    </div>
                                    <div itemvalue="4" class="luckysheet-cols-menuitem luckysheet-mousedown-cancel" style="width: 28px; height: 26px;padding: 5px;float: left;">
                                        <div class="luckysheet-mousedown-cancel bgImgBox" style="background-position: 0 -36px;" title="${conditionformat_text.colorGradation_5}"></div>
                                    </div>
                                    <div itemvalue="5" class="luckysheet-cols-menuitem luckysheet-mousedown-cancel" style="width: 28px; height: 26px;padding: 5px;float: left;">
                                        <div class="luckysheet-mousedown-cancel bgImgBox" style="background-position: -38px -36px;" title="${conditionformat_text.colorGradation_6}"></div>
                                    </div>
                                    <div itemvalue="6" class="luckysheet-cols-menuitem luckysheet-mousedown-cancel" style="width: 28px; height: 26px;padding: 5px;float: left;">
                                        <div class="luckysheet-mousedown-cancel bgImgBox" style="background-position: -76px -36px;" title="${conditionformat_text.colorGradation_7}"></div>
                                    </div>
                                    <div itemvalue="7" class="luckysheet-cols-menuitem luckysheet-mousedown-cancel" style="width: 28px; height: 26px;padding: 5px;float: left;">
                                        <div class="luckysheet-mousedown-cancel bgImgBox" style="background-position: -114px -36px;" title="${conditionformat_text.colorGradation_8}"></div>
                                    </div>
                                    <div itemvalue="8" class="luckysheet-cols-menuitem luckysheet-mousedown-cancel" style="width: 28px; height: 26px;padding: 5px;float: left;">
                                        <div class="luckysheet-mousedown-cancel bgImgBox" style="background-position: 0 -72px;" title="${conditionformat_text.colorGradation_9}"></div>
                                    </div>
                                    <div itemvalue="9" class="luckysheet-cols-menuitem luckysheet-mousedown-cancel" style="width: 28px; height: 26px;padding: 5px;float: left;">
                                        <div class="luckysheet-mousedown-cancel bgImgBox" style="background-position: -38px -72px;" title="${conditionformat_text.colorGradation_10}"></div>
                                    </div>
                                    <div itemvalue="10" class="luckysheet-cols-menuitem luckysheet-mousedown-cancel" style="width: 28px; height: 26px;padding: 5px;float: left;">
                                        <div class="luckysheet-mousedown-cancel bgImgBox" style="background-position: -76px -72px;" title="${conditionformat_text.colorGradation_11}"></div>
                                    </div>
                                    <div itemvalue="11" class="luckysheet-cols-menuitem luckysheet-mousedown-cancel" style="width: 28px; height: 26px;padding: 5px;float: left;">
                                        <div class="luckysheet-mousedown-cancel bgImgBox" style="background-position: -114px -72px;" title="${conditionformat_text.colorGradation_12}"></div>
                                    </div>
                                </div>`

        //清除规则子菜单
        let subitemdata6 = [
          {
            text: conditionformat_text.deleteSheetRule,
            value: 'delSheet',
            example: '',
          },
        ]
        let subitemset6 = _this.createButtonMenu(subitemdata6)
        let submenu6 = replaceHtml(_this.menu, {
          id: 'deleteRule',
          item: subitemset6,
          subclass: 'luckysheet-menuButton-sub',
        })

        $('body')
          .first()
          .append(menu + submenu + submenu2 + submenu3 + submenu4 + submenu6)
        $menuButton = $('#' + menuButtonId).width(190)
        $('#luckysheet-icon-highlightCellRule-menuButton').width(160)
        $('#luckysheet-icon-projectSelectRule-menuButton').width(180)

        $menuButton.find('.luckysheet-cols-menuitem').click(function () {
          $menuButton.hide()
          luckysheetContainerFocus()

          let $t = $(this),
            itemvalue = $t.attr('itemvalue')

          if (itemvalue == 'icons') {
            if (Store.luckysheet_select_save.length == 0) {
              if (isEditMode()) {
                alert(conditionformat_text.pleaseSelectRange)
              } else {
                tooltip.info(conditionformat_text.pleaseSelectRange, '')
              }
              return
            }

            conditionformat.CFiconsDialog()
            conditionformat.init()
          } else if (itemvalue == 'newRule') {
            if (Store.luckysheet_select_save.length == 0) {
              if (isEditMode()) {
                alert(conditionformat_text.pleaseSelectRange)
              } else {
                tooltip.info(conditionformat_text.pleaseSelectRange, '')
              }
              return
            }

            conditionformat.newConditionRuleDialog(0)
            conditionformat.init()
          } else if (itemvalue == 'administerRule') {
            let loadSheetUrl = server.loadSheetUrl
            let file = getluckysheetfile()

            if (loadSheetUrl != '' && loadSheetUrl != null) {
              let sheetindex = []
              for (let i = 0; i < file.length; i++) {
                sheetindex.push(file[i].index)
              }

              $.post(
                loadSheetUrl,
                { gridKey: server.gridKey, index: sheetindex.join(',') },
                function (d) {
                  let dataset = new Function('return ' + d)()

                  setTimeout(function () {
                    Store.loadingObj.close()
                  }, 500)

                  for (let item in dataset) {
                    if (item == Store.currentSheetIndex) {
                      continue
                    }

                    let otherfile = file[getSheetIndex(item)]

                    otherfile.celldata = dataset[item.toString()]
                    otherfile['data'] = sheetmanage.buildGridData(otherfile)
                  }

                  setluckysheetfile(file)

                  conditionformat.fileClone = $.extend(true, [], file)
                  conditionformat.administerRuleDialog()
                  conditionformat.init()
                }
              )
            } else {
              conditionformat.fileClone = $.extend(true, [], file)
              conditionformat.administerRuleDialog()
              conditionformat.init()
            }
          }
        })

        //突出显示单元格规则子菜单点击事件
        $(document)
          .off('click.CFhighlightCellRule')
          .on(
            'click.CFhighlightCellRule',
            '#luckysheet-icon-highlightCellRule-menuButton .luckysheet-cols-menuitem',
            function () {
              $menuButton.hide()
              $('#luckysheet-icon-highlightCellRule-menuButton').hide()
              luckysheetContainerFocus()

              let $t = $(this),
                itemvalue = $t.attr('itemvalue')

              if (Store.luckysheet_select_save.length == 0) {
                if (isEditMode()) {
                  alert(conditionformat_text.pleaseSelectRange)
                } else {
                  tooltip.info(conditionformat_text.pleaseSelectRange, '')
                }
                return
              } else {
                let textCellColorHtml = conditionformat.textCellColorHtml()

                let title, content
                switch (itemvalue) {
                  case 'greaterThan':
                    title = conditionformat_text.conditionformat_greaterThan
                    content = `<div class="box" data-itemvalue="greaterThan">
                                                <div class="boxTitleOne">${conditionformat_text.conditionformat_greaterThan_title}：</div>
                                                <div class="inpbox range">
                                                    <input id="conditionVal" class="formulaInputFocus"/>
                                                    <i class="fa fa-table" aria-hidden="true" title="${conditionformat_text.selectCell}"></i>
                                                </div>
                                                <div style="margin: 5px 0;">${conditionformat_text.setAs}：</div> 
                                                ${textCellColorHtml} 
                                            </div>`
                    break
                  case 'lessThan':
                    title = conditionformat_text.conditionformat_lessThan
                    content = `<div class="box" data-itemvalue="lessThan">
                                                <div class="boxTitleOne">${conditionformat_text.conditionformat_lessThan_title}：</div>
                                                <div class="inpbox range">
                                                    <input id="conditionVal" class="formulaInputFocus"/>
                                                    <i class="fa fa-table" aria-hidden="true" title="${conditionformat_text.selectCell}"></i>
                                                </div>
                                                <div style="margin: 5px 0;">${conditionformat_text.setAs}：</div>
                                                ${textCellColorHtml}
                                            </div>`
                    break
                  case 'betweenness':
                    title = conditionformat_text.conditionformat_betweenness
                    content = `<div class="box" data-itemvalue="betweenness">
                                                <div class="boxTitleOne">${conditionformat_text.conditionformat_betweenness_title}：</div>
                                                <div style="height: 30px;line-height: 30px;">
                                                    <div class="inpbox2 range">
                                                        <input id="conditionVal" class="formulaInputFocus"/>
                                                        <i class="fa fa-table" aria-hidden="true" title="${conditionformat_text.selectCell}"></i>
                                                    </div>
                                                    <div style="float: left;height: 30px;line-height: 30px;margin: 0 5px;">${conditionformat_text.to}</div>
                                                    <div class="inpbox2 range">
                                                        <input id="conditionVal2" class="formulaInputFocus"/>
                                                        <i class="fa fa-table" aria-hidden="true" title="${conditionformat_text.selectCell}"></i>
                                                    </div>
                                                </div>
                                                <div style="margin: 5px 0;">${conditionformat_text.setAs}：</div>
                                                ${textCellColorHtml}
                                            </div>`
                    break
                  case 'equal':
                    title = conditionformat_text.conditionformat_equal
                    content = `<div class="box" data-itemvalue="equal">
                                                <div class="boxTitleOne">${conditionformat_text.conditionformat_equal_title}：</div>
                                                <div class="inpbox range">
                                                    <input id="conditionVal" class="formulaInputFocus"/>
                                                    <i class="fa fa-table" aria-hidden="true" title="${conditionformat_text.selectCell}"></i>
                                                </div>
                                                <div style="margin: 5px 0;">${conditionformat_text.setAs}：</div>
                                                ${textCellColorHtml}
                                            </div>`
                    break
                  case 'textContains':
                    title = conditionformat_text.conditionformat_textContains
                    content = `<div class="box" data-itemvalue="textContains">
                                                <div class="boxTitleOne">${conditionformat_text.conditionformat_textContains_title}：</div>
                                                <div class="inpbox range">
                                                    <input id="conditionVal" class="formulaInputFocus"/>
                                                    <i class="fa fa-table" aria-hidden="true" title="${conditionformat_text.selectCell}"></i>
                                                </div>
                                                <div style="margin: 5px 0;">${conditionformat_text.setAs}：</div>
                                                ${textCellColorHtml}
                                            </div>`
                    break
                  case 'occurrenceDate':
                    title = conditionformat_text.conditionformat_occurrenceDate
                    content = `<div class="box" data-itemvalue="occurrenceDate">
                                                <div class="boxTitleOne">${conditionformat_text.conditionformat_occurrenceDate_title}：</div>
                                                <div class="inpbox">
                                                    <input id="daterange-btn" class="formulaInputFocus" readonly="readonly" placeholder="${conditionformat_text.pleaseSelectADate}"/>
                                                </div>
                                                <div style="margin: 5px 0;">${conditionformat_text.setAs}：</div>
                                                ${textCellColorHtml}
                                            </div>`
                    break
                  case 'duplicateValue':
                    title = conditionformat_text.conditionformat_duplicateValue
                    content = `<div class="box" data-itemvalue="duplicateValue">
                                                <div class="boxTitleOne">${conditionformat_text.conditionformat_duplicateValue_title}：</div>
                                                <select id="conditionVal" class="selectbox">
                                                    <option value="0">${conditionformat_text.duplicateValue}</option>
                                                    <option value="1">${conditionformat_text.uniqueValue}</option>
                                                </select>
                                                <div style="margin:5px 0;">${conditionformat_text.setAs}：</div>
                                                ${textCellColorHtml}
                                            </div>`
                    break
                }

                conditionformat.conditionformatDialog(title, content)
              }
            }
          )

        //项目选取规则子菜单点击事件
        $(document)
          .off('click.CFprojectSelectRule')
          .on(
            'click.CFprojectSelectRule',
            '#luckysheet-icon-projectSelectRule-menuButton .luckysheet-cols-menuitem',
            function () {
              $menuButton.hide()
              $('#luckysheet-icon-projectSelectRule-menuButton').hide()
              luckysheetContainerFocus()

              let $t = $(this),
                itemvalue = $t.attr('itemvalue')

              if (Store.luckysheet_select_save.length == 0) {
                if (isEditMode()) {
                  alert(conditionformat_text.pleaseSelectRange)
                } else {
                  tooltip.info(conditionformat_text.pleaseSelectRange, '')
                }
                return
              } else {
                let textCellColorHtml = conditionformat.textCellColorHtml()

                let title, content
                switch (itemvalue) {
                  case 'top10':
                    title = conditionformat_text.conditionformat_top10
                    content = `<div class="box" data-itemvalue="top10">
                                                <div class="boxTitleOne">${conditionformat_text.conditionformat_top10_title}：</div>
                                                <div style="height: 30px;line-height: 30px;">
                                                    <div style="float: left;height: 30px;line-height: 30px;margin: 0 5px;">${conditionformat_text.top}</div>
                                                    <div class="inpbox2">
                                                        <input id="conditionVal" class="formulaInputFocus" type="number" value="10"/>
                                                    </div>
                                                    <div style="float: left;height: 30px;line-height: 30px;margin: 0 5px;">${conditionformat_text.oneself}</div>
                                                </div>
                                                <div style="margin: 5px 0;">${conditionformat_text.setAs}：</div>
                                                ${textCellColorHtml}
                                            </div>`
                    break
                  case 'top10%':
                    title = conditionformat_text.conditionformat_top10_percent
                    content = `<div class="box" data-itemvalue="top10%">
                                                <div class="boxTitleOne">${conditionformat_text.conditionformat_top10_title}：</div>
                                                <div style="height: 30px;line-height: 30px;">
                                                    <div style="float: left;height: 30px;line-height: 30px;margin: 0 5px;">${conditionformat_text.top}</div>
                                                    <div class="inpbox2">
                                                        <input id="conditionVal" class="formulaInputFocus" type="number" value="10"/>
                                                    </div>
                                                    <div style="float: left;height: 30px;line-height: 30px;margin: 0 5px;">%</div>
                                                </div>
                                                <div style="margin: 5px 0;">${conditionformat_text.setAs}：</div>
                                                ${textCellColorHtml}
                                            </div>`
                    break
                  case 'last10':
                    title = conditionformat_text.conditionformat_last10
                    content = `<div class="box" data-itemvalue="last10">
                                                <div class="boxTitleOne">${conditionformat_text.conditionformat_last10_title}：</div>
                                                <div style="height: 30px;line-height: 30px;">
                                                    <div style="float: left;height: 30px;line-height: 30px;margin: 0 5px;">${conditionformat_text.last}</div>
                                                    <div class="inpbox2">
                                                        <input id="conditionVal" class="formulaInputFocus" type="number" value="10"/>
                                                    </div>
                                                    <div style="float: left;height: 30px;line-height: 30px;margin: 0 5px;">${conditionformat_text.oneself}</div>
                                                </div>
                                                <div style="margin: 5px 0;">${conditionformat_text.setAs}：</div>
                                                ${textCellColorHtml}
                                            </div>`
                    break
                  case 'last10%':
                    title = conditionformat_text.conditionformat_last10_percent
                    content = `<div class="box" data-itemvalue="last10%">
                                                <div class="boxTitleOne">${conditionformat_text.conditionformat_last10_title}：</div>
                                                <div style="height: 30px;line-height: 30px;">
                                                    <div style="float: left;height: 30px;line-height: 30px;margin: 0 5px;">${conditionformat_text.last}</div>
                                                    <div class="inpbox2">
                                                        <input id="conditionVal" class="formulaInputFocus" type="number" value="10"/>
                                                    </div>
                                                    <div style="float: left;height: 30px;line-height: 30px;margin: 0 5px;">%</div>
                                                </div>
                                                <div style="margin:5px 0;">设置为：</div>
                                                ${textCellColorHtml}
                                            </div>`
                    break
                  case 'AboveAverage':
                    title = conditionformat_text.conditionformat_AboveAverage
                    content = `<div class="box" data-itemvalue="AboveAverage">
                                                <div class="boxTitleOne">${conditionformat_text.conditionformat_AboveAverage_title}：</div>
                                                <div style="margin: 5px 0;">${conditionformat_text.setAsByArea}：</div>
                                                ${textCellColorHtml}
                                            </div>`
                    break
                  case 'SubAverage':
                    title = conditionformat_text.conditionformat_SubAverage
                    content = `<div class="box" data-itemvalue="SubAverage">
                                                <div class="boxTitleOne">${conditionformat_text.conditionformat_SubAverage_title}：</div>
                                                <div style="margin: 5px 0;">${conditionformat_text.setAsByArea}：</div>
                                                ${textCellColorHtml}
                                            </div>`
                    break
                }

                conditionformat.conditionformatDialog(title, content)
              }
            }
          )

        //数据条子菜单点击事件
        $(document)
          .off('click.CFdataBar')
          .on(
            'click.CFdataBar',
            '#luckysheet-icon-dataBar-menuButton .luckysheet-cols-menuitem',
            function () {
              $menuButton.hide()
              $('#luckysheet-icon-dataBar-menuButton').hide()
              luckysheetContainerFocus()

              let $t = $(this),
                itemvalue = $t.attr('itemvalue')

              if (Store.luckysheet_select_save.length > 0) {
                let cellrange = $.extend(true, [], Store.luckysheet_select_save)
                let format = conditionformat.dataBarList[itemvalue]['format']

                conditionformat.updateItem('dataBar', cellrange, format)
              }
            }
          )

        //色阶子菜单点击事件
        $(document)
          .off('click.CFcolorGradation')
          .on(
            'click.CFcolorGradation',
            '#luckysheet-icon-colorGradation-menuButton .luckysheet-cols-menuitem',
            function () {
              $menuButton.hide()
              $('#luckysheet-icon-colorGradation-menuButton').hide()
              luckysheetContainerFocus()

              let $t = $(this),
                itemvalue = $t.attr('itemvalue')

              if (Store.luckysheet_select_save.length > 0) {
                let cellrange = $.extend(true, [], Store.luckysheet_select_save)
                let format =
                  conditionformat.colorGradationList[itemvalue]['format']

                conditionformat.updateItem('colorGradation', cellrange, format)
              }
            }
          )

        //清除规则子菜单点击事件
        $(document)
          .off('click.CFdeleteRule')
          .on(
            'click.CFdeleteRule',
            '#luckysheet-icon-deleteRule-menuButton .luckysheet-cols-menuitem',
            function () {
              $menuButton.hide()
              $('#luckysheet-icon-deleteRule-menuButton').hide()
              luckysheetContainerFocus()

              let $t = $(this),
                itemvalue = $t.attr('itemvalue')

              if (itemvalue == 'delSheet') {
                conditionformat.updateItem('delSheet')
              }
            }
          )
      }

      let userlen = $(this).outerWidth()
      let tlen = $menuButton.outerWidth()

      let menuleft = $(this).offset().left
      if (
        tlen > userlen &&
        tlen + menuleft > $('#' + Store.container).width()
      ) {
        menuleft = menuleft - tlen + userlen
      }
      mouseclickposition(
        $menuButton,
        menuleft,
        $(this).offset().top + 25,
        'lefttop'
      )
    })

    //批注
    $('#luckysheet-icon-postil').click(function () {
      let menuButtonId = $(this).attr('id') + '-menuButton'
      let $menuButton = $('#' + menuButtonId)

      const locale_comment = locale().comment

      $menuButton.remove()

      // if($menuButton.length == 0){
      luckysheetPostil.removeActivePs()

      let last =
        Store.luckysheet_select_save[Store.luckysheet_select_save.length - 1]

      let row_index = last['row_focus']
      if (row_index == null) {
        row_index = last['row'][0]
      }

      let col_index = last['column_focus']
      if (col_index == null) {
        col_index = last['column'][0]
      }

      let itemdata
      if (
        Store.flowdata[row_index][col_index] != null &&
        Store.flowdata[row_index][col_index].ps != null
      ) {
        itemdata = [
          { text: locale_comment.edit, value: 'editPs', example: '' },
          { text: locale_comment.delete, value: 'delPs', example: '' },
          { text: '', value: 'split', example: '' },
          { text: locale_comment.showOne, value: 'showHidePs', example: '' },
          { text: locale_comment.showAll, value: 'showHideAllPs', example: '' },
        ]
      } else {
        itemdata = [
          { text: locale_comment.insert, value: 'newPs', example: '' },
          { text: '', value: 'split', example: '' },
          { text: locale_comment.showAll, value: 'showHideAllPs', example: '' },
        ]
      }

      let itemset = _this.createButtonMenu(itemdata)
      let menu = replaceHtml(_this.menu, {
        id: 'postil',
        item: itemset,
        subclass: '',
        sub: '',
      })

      $('body')
        .first()
        .append(menu)
      $menuButton = $('#' + menuButtonId).width(150)

      $menuButton.find('.luckysheet-cols-menuitem').click(function () {
        $menuButton.hide()
        luckysheetContainerFocus()

        let $t = $(this),
          itemvalue = $t.attr('itemvalue')

        if (itemvalue == 'newPs') {
          luckysheetPostil.newPs(row_index, col_index)
        } else if (itemvalue == 'editPs') {
          luckysheetPostil.editPs(row_index, col_index)
        } else if (itemvalue == 'delPs') {
          luckysheetPostil.delPs(row_index, col_index)
        } else if (itemvalue == 'showHidePs') {
          luckysheetPostil.showHidePs(row_index, col_index)
        } else if (itemvalue == 'showHideAllPs') {
          luckysheetPostil.showHideAllPs()
        }
      })
      // }

      let userlen = $(this).outerWidth()
      let tlen = $menuButton.outerWidth()

      let menuleft = $(this).offset().left
      if (
        tlen > userlen &&
        tlen + menuleft > $('#' + Store.container).width()
      ) {
        menuleft = menuleft - tlen + userlen
      }
      mouseclickposition(
        $menuButton,
        menuleft,
        $(this).offset().top + 25,
        'lefttop'
      )
    })

    //sheet protection
    $('#luckysheet-icon-protection').click(function () {
      const sheetFile = sheetmanage.getSheetByIndex()
      $('#luckysheet-modal-dialog-slider-dataconfig').hide()
      openProtectionModal(sheetFile)
    })

    //sheet DataConfiguration
    $('#luckysheet-icon-DataConfiguration').click(function () {
      const sheetFile = sheetmanage.getSheetByIndex()
      $('#luckysheet-modal-dialog-slider-protection').hide()
      openDataConfigurationModal(sheetFile)
    })

    //print
    $('#luckysheet-icon-print').click(function () {
      let menuButtonId = $(this).attr('id') + '-menuButton'
      let $menuButton = $('#' + menuButtonId)
      const _locale = locale()
      const locale_print = _locale.print
      if ($menuButton.length == 0) {
        let itemdata = [
          {
            text: locale_print.menuItemPrint,
            value: 'print',
            example:
              '<i class="lksticonfont  luckysheet-lksticonfont -dayin" aria-hidden="true"></i>',
          },
          { text: '', value: 'split', example: '' },
          {
            text: locale_print.menuItemAreas,
            value: 'areas',
            example:
              '<i class="lksticonfont  luckysheet-lksticonfont -tihuan" aria-hidden="true"></i>',
          },
          {
            text: locale_print.menuItemRows,
            value: 'rows',
            example:
              '<i class="lksticonfont  luckysheet-lksticonfont -zhuandao1" aria-hidden="true"></i>',
          },
          {
            text: locale_print.menuItemColumns,
            value: 'columns',
            example:
              '<i class="lksticonfont  luckysheet-lksticonfont -dingwei" aria-hidden="true"></i>',
          },
        ]

        let itemset = _this.createButtonMenu(itemdata)

        let menu = replaceHtml(_this.menu, {
          id: 'print',
          item: itemset,
          subclass: '',
          sub: '',
        })

        $('body')
          .first()
          .append(menu)
        $menuButton = $('#' + menuButtonId).width(180)

        $menuButton.find('.luckysheet-cols-menuitem').click(function () {
          $menuButton.hide()
          luckysheetContainerFocus()

          let $t = $(this),
            itemvalue = $t.attr('itemvalue')

          if (itemvalue == 'print') {
            //Print config
            alert('print')
          } else if (
            itemvalue == 'areas' ||
            itemvalue == 'rows' ||
            itemvalue == 'columns'
          ) {
            //range
            alert('areas')
          }
        })
      }

      let userlen = $(this).outerWidth()
      let tlen = $menuButton.outerWidth()

      let menuleft = $(this).offset().left
      if (
        tlen > userlen &&
        tlen + menuleft > $('#' + Store.container).width()
      ) {
        menuleft = menuleft - tlen + userlen
      }
      mouseclickposition(
        $menuButton,
        menuleft,
        $(this).offset().top + 25,
        'lefttop'
      )
    })
    // 保存按钮事件
    $('#luckysheet-icon-saveBtn').click(function () {

      if (Store.compType === 'design') {
        _this.desingSaveFnc()
      } else if (Store.compType === 'filling') {
        _this.fillingSaveFnc()
      }
    })

    // 提交按钮事件
    $('#luckysheet-icon-submitBtn').click(function () {
      if (Store.compType === 'filling') {
        _this.fillingSubmitFnc()
      }
    })
    // 关闭按钮事件
    $('#luckysheet-icon-closeBtn').click(function () {
      domDestroyed()
    })

    $('body')
      .first()
      .on(
        'mouseover mouseleave',
        '.luckysheet-menuButton .luckysheet-cols-submenu',
        function (e) {
          let $t = $(this),
            attrid = $t.attr('itemvalue'),
            $attr = $('#luckysheet-icon-' + attrid + '-menuButton')

          if (e.type === 'mouseover') {
            let $con = $t.parent()
            let winW = $(window).width(),
              winH = $(window).height()
            let menuW = $con.width(),
              attrH = $attr.height() + 25,
              attrW = $attr.width() + 5
            let offset = $t.offset()
            let top = offset.top,
              left = offset.left + menuW

            if (left + attrW > winW) {
              left = offset.left - attrW
            }

            if (top + attrH > winH) {
              top = winH - attrH
            }

            $attr.css({ top: top, left: left }).show()
            _this.rightclickmenu = $t
          } else {
            clearTimeout(_this.submenuhide[$attr.attr('id')])
            _this.submenuhide[$attr.attr('id')] = setTimeout(function () {
              $attr.hide()
            }, 200)
          }
        }
      )
      .on('mouseover mouseleave', '.luckysheet-menuButton-sub', function (e) {
        if (e.type === 'mouseover') {
          _this.rightclickmenu.addClass('luckysheet-cols-menuitem-hover')
          clearTimeout(_this.submenuhide[$(this).attr('id')])
        } else {
          _this.rightclickmenu.removeClass('luckysheet-cols-menuitem-hover')
          $(this).hide()
        }
      })
  },
  getQKBorder: function (width, type, color) {
    let bordertype = ''

    if (width.indexOf('pt') > -1) {
      width = parseFloat(width)

      if (width < 1) {
      } else if (width < 1.5) {
        bordertype = 'Medium'
      } else {
        bordertype = 'Thick'
      }
    } else {
      width = parseFloat(width)

      if (width < 2) {
      } else if (width < 3) {
        bordertype = 'Medium'
      } else {
        bordertype = 'Thick'
      }
    }

    let style = 0
    type = type.toLowerCase()

    if (type == 'double') {
      style = 2
    } else if (type == 'dotted') {
      if (bordertype == 'Medium' || bordertype == 'Thick') {
        style = 3
      } else {
        style = 10
      }
    } else if (type == 'dashed') {
      if (bordertype == 'Medium' || bordertype == 'Thick') {
        style = 4
      } else {
        style = 9
      }
    } else if (type == 'solid') {
      if (bordertype == 'Medium') {
        style = 8
      } else if (bordertype == 'Thick') {
        style = 13
      } else {
        style = 1
      }
    }

    return [style, color]
  },
  updateFormatCell: function (
    d,
    attr,
    foucsStatus,
    row_st,
    row_ed,
    col_st,
    col_ed
  ) {
    if (d == null || attr == null) {
      return
    }
    if (attr == 'ct') {
      for (let r = row_st; r <= row_ed; r++) {
        if (
          Store.config['rowhidden'] != null &&
          Store.config['rowhidden'][r] != null
        ) {
          continue
        }

        for (let c = col_st; c <= col_ed; c++) {
          let cell = d[r][c],
            value = null

          if (getObjType(cell) == 'object') {
            value = d[r][c]['v']
          } else {
            value = d[r][c]
          }

          if (foucsStatus != '@' && isRealNum(value)) {
            value = parseFloat(value)
          }

          let mask = update(foucsStatus, value)
          let type = 'n'

          if (
            is_date(foucsStatus) ||
            foucsStatus === 14 ||
            foucsStatus === 15 ||
            foucsStatus === 16 ||
            foucsStatus === 17 ||
            foucsStatus === 18 ||
            foucsStatus === 19 ||
            foucsStatus === 20 ||
            foucsStatus === 21 ||
            foucsStatus === 22 ||
            foucsStatus === 45 ||
            foucsStatus === 46 ||
            foucsStatus === 47
          ) {
            type = 'd'
          } else if (foucsStatus == '@' || foucsStatus === 49) {
            type = 's'
          } else if (foucsStatus == 'General' || foucsStatus === 0) {
            // type = "g";
            type = isRealNum(value) ? 'n' : 'g'
          }

          if (getObjType(cell) == 'object') {
            d[r][c]['m'] = mask
            if (d[r][c]['ct'] == null) {
              d[r][c]['ct'] = {}
            }
            d[r][c]['ct']['fa'] = foucsStatus
            d[r][c]['ct']['t'] = type
          } else {
            d[r][c] = { ct: { fa: foucsStatus, t: type }, v: value, m: mask }
          }
        }
      }
    } else {
      if (attr == 'ht') {
        if (foucsStatus == 'left') {
          foucsStatus = '1'
        } else if (foucsStatus == 'center') {
          foucsStatus = '0'
        } else if (foucsStatus == 'right') {
          foucsStatus = '2'
        }
      } else if (attr == 'vt') {
        if (foucsStatus == 'top') {
          foucsStatus = '1'
        } else if (foucsStatus == 'middle') {
          foucsStatus = '0'
        } else if (foucsStatus == 'bottom') {
          foucsStatus = '2'
        }
      } else if (attr == 'tb') {
        if (foucsStatus == 'overflow') {
          foucsStatus = '1'
        } else if (foucsStatus == 'clip') {
          foucsStatus = '0'
        } else if (foucsStatus == 'wrap') {
          foucsStatus = '2'
        }
      } else if (attr == 'tr') {
        if (foucsStatus == 'none') {
          foucsStatus = '0'
        } else if (foucsStatus == 'angleup') {
          foucsStatus = '1'
        } else if (foucsStatus == 'angledown') {
          foucsStatus = '2'
        } else if (foucsStatus == 'vertical') {
          foucsStatus = '3'
        } else if (foucsStatus == 'rotation-up') {
          foucsStatus = '4'
        } else if (foucsStatus == 'rotation-down') {
          foucsStatus = '5'
        }
      }

      for (let r = row_st; r <= row_ed; r++) {
        if (
          Store.config['rowhidden'] != null &&
          Store.config['rowhidden'][r] != null
        ) {
          continue
        }

        for (let c = col_st; c <= col_ed; c++) {
          let value = d[r][c]

          if (getObjType(value) == 'object') {
            // if(attr in inlineStyleAffectAttribute && isInlineStringCell(value)){
            updateInlineStringFormatOutside(value, attr, foucsStatus)
            // }
            // else{
            d[r][c][attr] = foucsStatus
            // }
          } else {
            d[r][c] = { v: value }
            d[r][c][attr] = foucsStatus
          }

          // if(attr == "tr" && d[r][c].tb != null){
          //     d[r][c].tb = "0";
          // }
        }
      }
    }
  },
  updateFormat: function (d, attr, foucsStatus) {
    if (!checkProtectionFormatCells(Store.currentSheetIndex)) {
      return
    }

    // *如果禁止前台编辑，则中止下一步操作
    if (!checkIsAllowEdit()) {
      tooltip.info('', locale().pivotTable.errorNotAllowEdit)
      return
    }

    let canvasElement = document.createElement('canvas')
    if (attr in inlineStyleAffectAttribute) {
      if (parseInt($('#luckysheet-input-box').css('top')) > 0) {
        let value = $('#luckysheet-input-box').text()
        if (value.substr(0, 1) != '=') {
          let cell =
            d[Store.luckysheetCellUpdate[0]][Store.luckysheetCellUpdate[1]]
          updateInlineStringFormat(
            cell,
            attr,
            foucsStatus,
            formula.rangeResizeTo
          )
          // return;
        }
      }
    }

    let cfg = $.extend(true, {}, Store.config)
    if (cfg['rowlen'] == null) {
      cfg['rowlen'] = {}
    }

    for (let s = 0; s < Store.luckysheet_select_save.length; s++) {
      let row_st = Store.luckysheet_select_save[s]['row'][0],
        row_ed = Store.luckysheet_select_save[s]['row'][1]
      let col_st = Store.luckysheet_select_save[s]['column'][0],
        col_ed = Store.luckysheet_select_save[s]['column'][1]

      this.updateFormatCell(
        d,
        attr,
        foucsStatus,
        row_st,
        row_ed,
        col_st,
        col_ed
      )

      if (attr == 'tb' || attr == 'tr' || attr == 'fs') {
        cfg = rowlenByRange(d, row_st, row_ed, cfg)
      }
    }

    let allParam = {}
    if (attr == 'tb' || attr == 'tr' || attr == 'fs') {
      allParam = {
        cfg: cfg,
        RowlChange: true,
      }
    }

    jfrefreshgrid(d, Store.luckysheet_select_save, allParam, false)
  },
  updateFormat_mc: function (d, foucsStatus) {
    // *如果禁止前台编辑，则中止下一步操作
    if (!checkIsAllowEdit()) {
      tooltip.info('', locale().pivotTable.errorNotAllowEdit)
      return
    }
    let cfg = $.extend(true, {}, Store.config)
    if (cfg['merge'] == null) {
      cfg['merge'] = {}
    }

    if (!checkProtectionNotEnable(Store.currentSheetIndex)) {
      return
    }

    if (foucsStatus == 'mergeCancel') {
      for (let i = 0; i < Store.luckysheet_select_save.length; i++) {
        let range = Store.luckysheet_select_save[i]
        let r1 = range['row'][0],
          r2 = range['row'][1]
        let c1 = range['column'][0],
          c2 = range['column'][1]

        if (r1 == r2 && c1 == c2) {
          continue
        }

        let fv = {}

        for (let r = r1; r <= r2; r++) {
          for (let c = c1; c <= c2; c++) {
            let cell = d[r][c]

            if (cell != null && cell.mc != null) {
              let mc_r = cell.mc.r,
                mc_c = cell.mc.c

              if ('rs' in cell.mc) {
                delete cell.mc
                delete cfg['merge'][mc_r + '_' + mc_c]

                fv[mc_r + '_' + mc_c] = $.extend(true, {}, cell)
              } else {
                // let cell_clone = fv[mc_r + "_" + mc_c];
                let cell_clone = JSON.parse(
                  JSON.stringify(fv[mc_r + '_' + mc_c])
                )

                delete cell_clone.v
                delete cell_clone.m
                delete cell_clone.ct
                delete cell_clone.f
                delete cell_clone.spl

                d[r][c] = cell_clone
              }
            }
          }
        }
      }
    } else {
      let isHasMc = false //选区是否含有 合并的单元格

      for (let i = 0; i < Store.luckysheet_select_save.length; i++) {
        let range = Store.luckysheet_select_save[i]
        let r1 = range['row'][0],
          r2 = range['row'][1]
        let c1 = range['column'][0],
          c2 = range['column'][1]

        for (let r = r1; r <= r2; r++) {
          for (let c = c1; c <= c2; c++) {
            let cell = d[r][c]

            if (getObjType(cell) == 'object' && 'mc' in cell) {
              isHasMc = true
              break
            }
          }
        }
      }

      if (isHasMc) {
        //选区有合并单元格（选区都执行 取消合并）
        for (let i = 0; i < Store.luckysheet_select_save.length; i++) {
          let range = Store.luckysheet_select_save[i]
          let r1 = range['row'][0],
            r2 = range['row'][1]
          let c1 = range['column'][0],
            c2 = range['column'][1]

          if (r1 == r2 && c1 == c2) {
            continue
          }

          let fv = {}

          for (let r = r1; r <= r2; r++) {
            for (let c = c1; c <= c2; c++) {
              let cell = d[r][c]

              if (cell != null && cell.mc != null) {
                let mc_r = cell.mc.r,
                  mc_c = cell.mc.c

                if ('rs' in cell.mc) {
                  delete cell.mc
                  delete cfg['merge'][mc_r + '_' + mc_c]

                  fv[mc_r + '_' + mc_c] = $.extend(true, {}, cell)
                } else {
                  // let cell_clone = fv[mc_r + "_" + mc_c];
                  let cell_clone = JSON.parse(
                    JSON.stringify(fv[mc_r + '_' + mc_c])
                  )

                  delete cell_clone.v
                  delete cell_clone.m
                  delete cell_clone.ct
                  delete cell_clone.f
                  delete cell_clone.spl

                  d[r][c] = cell_clone
                }
              }
            }
          }
        }
      } else {
        for (let i = 0; i < Store.luckysheet_select_save.length; i++) {
          let range = Store.luckysheet_select_save[i]
          let r1 = range['row'][0],
            r2 = range['row'][1]
          let c1 = range['column'][0],
            c2 = range['column'][1]

          if (r1 == r2 && c1 == c2) {
            continue
          }

          if (foucsStatus == 'mergeAll') {
            let fv = {},
              isfirst = false

            for (let r = r1; r <= r2; r++) {
              for (let c = c1; c <= c2; c++) {
                let cell = d[r][c]

                if (
                  cell != null &&
                  (isInlineStringCT(cell.ct) ||
                    !isRealNull(cell.v) ||
                    cell.f != null) &&
                  !isfirst
                ) {
                  fv = $.extend(true, {}, cell)
                  isfirst = true
                }

                d[r][c] = { mc: { r: r1, c: c1 } }
              }
            }

            d[r1][c1] = fv
            d[r1][c1].mc = { r: r1, c: c1, rs: r2 - r1 + 1, cs: c2 - c1 + 1 }

            cfg['merge'][r1 + '_' + c1] = {
              r: r1,
              c: c1,
              rs: r2 - r1 + 1,
              cs: c2 - c1 + 1,
            }
          } else if (foucsStatus == 'mergeV') {
            for (let c = c1; c <= c2; c++) {
              let fv = {},
                isfirst = false

              for (let r = r1; r <= r2; r++) {
                let cell = d[r][c]

                if (
                  cell != null &&
                  (!isRealNull(cell.v) || cell.f != null) &&
                  !isfirst
                ) {
                  fv = $.extend(true, {}, cell)
                  isfirst = true
                }

                d[r][c] = { mc: { r: r1, c: c } }
              }

              d[r1][c] = fv
              d[r1][c].mc = { r: r1, c: c, rs: r2 - r1 + 1, cs: 1 }

              cfg['merge'][r1 + '_' + c] = {
                r: r1,
                c: c,
                rs: r2 - r1 + 1,
                cs: 1,
              }
            }
          } else if (foucsStatus == 'mergeH') {
            for (let r = r1; r <= r2; r++) {
              let fv = {},
                isfirst = false

              for (let c = c1; c <= c2; c++) {
                let cell = d[r][c]

                if (
                  cell != null &&
                  (!isRealNull(cell.v) || cell.f != null) &&
                  !isfirst
                ) {
                  fv = $.extend(true, {}, cell)
                  isfirst = true
                }

                d[r][c] = { mc: { r: r, c: c1 } }
              }

              d[r][c1] = fv
              d[r][c1].mc = { r: r, c: c1, rs: 1, cs: c2 - c1 + 1 }

              cfg['merge'][r + '_' + c1] = {
                r: r,
                c: c1,
                rs: 1,
                cs: c2 - c1 + 1,
              }
            }
          }
        }
      }
    }

    if (Store.clearjfundo) {
      Store.jfundo.length = 0
      Store.jfredo.push({
        type: 'mergeChange',
        sheetIndex: Store.currentSheetIndex,
        data: Store.flowdata,
        curData: d,
        range: $.extend(true, [], Store.luckysheet_select_save),
        config: $.extend(true, {}, Store.config),
        curConfig: cfg,
      })
    }

    Store.clearjfundo = false
    jfrefreshgrid(d, Store.luckysheet_select_save, { cfg: cfg })
    Store.clearjfundo = true
  },
  borderfix: function (d, r, c) {
    // return [-1, -1, 2, 2];

    let cell = d[r][c]
    let bg = null

    if (cell == null) {
      return [-1, 0, 0, -1]
    } else if (d[r][c].bg == null || d[r][c].bg == '') {
      return [-1, 0, 0, -1]
    } else {
      return [-2, -1, 1, 0]
      //return [-2, -2, 1, 0];
    }
  },
  changeMenuButtonDom: function (attr, foucsStatus, _locale) {
    let _this = this
    if (_locale == null) {
      _locale = locale()
    }
    const locale_fontarray = _locale.fontarray
    const locale_fontjson = _locale.fontjson

    if (attr == 'bl') {
      if (foucsStatus != '0') {
        $('#luckysheet-icon-bold').addClass('luckysheet-toolbar-button-hover')
      } else {
        $('#luckysheet-icon-bold').removeClass(
          'luckysheet-toolbar-button-hover'
        )
      }
    } else if (attr == 'it') {
      if (foucsStatus != '0') {
        $('#luckysheet-icon-italic').addClass('luckysheet-toolbar-button-hover')
      } else {
        $('#luckysheet-icon-italic').removeClass(
          'luckysheet-toolbar-button-hover'
        )
      }
    } else if (attr == 'cl') {
      if (foucsStatus != '0') {
        $('#luckysheet-icon-strikethrough').addClass(
          'luckysheet-toolbar-button-hover'
        )
      } else {
        $('#luckysheet-icon-strikethrough').removeClass(
          'luckysheet-toolbar-button-hover'
        )
      }
    } else if (attr == 'un') {
      if (foucsStatus != '0') {
        $('#luckysheet-icon-underline').addClass(
          'luckysheet-toolbar-button-hover'
        )
      } else {
        $('#luckysheet-icon-underline').removeClass(
          'luckysheet-toolbar-button-hover'
        )
      }
    } else if (attr == 'ff') {
      let menuButtonId = 'luckysheet-icon-font-family-menuButton'
      let $menuButton = $('#' + menuButtonId)
      // const locale_fontarray = locale().fontarray;
      let itemname = locale_fontarray[0],
        itemvalue = 0
      if (foucsStatus != null) {
        if (isdatatypemulti(foucsStatus)['num']) {
          itemvalue = parseInt(foucsStatus)
          itemname = locale_fontarray[itemvalue]

          if (itemname == null) {
            itemvalue = _this.defualtFont[itemvalue]
            itemname = itemvalue
            if (itemvalue != null) {
              _this.addFontTolist(itemvalue)
            }
          }
        } else {
          foucsStatus = foucsStatus.replace(/"/g, '').replace(/'/g, '')
          itemvalue = foucsStatus
          itemname = foucsStatus

          _this.addFontTolist(itemvalue)
        }
      }

      _this.focus($menuButton, itemvalue)
      $('#luckysheet-icon-font-family')
        .find('.luckysheet-toolbar-menu-button-caption')
        .html(' ' + itemname + ' ')
    } else if (attr == 'fs') {
      let $menuButton = $('#luckysheet-icon-font-size-menuButton')
      let itemvalue = foucsStatus,
        $input = $('#luckysheet-icon-font-size input')
      _this.focus($menuButton, itemvalue)
      $('#luckysheet-icon-font-size').attr('itemvalue', itemvalue)
      $input.val(itemvalue)
    } else if (attr == 'ht') {
      let $menuButton = $('#luckysheet-icon-align-menu-menuButton')
      let $t = $('luckysheet-icon-align'),
        itemvalue = 'left'

      if (foucsStatus == '0') {
        itemvalue = 'center'
      } else if (foucsStatus == '2') {
        itemvalue = 'right'
      }

      _this.focus($menuButton, itemvalue)

      // add lksticonfont
      const iconfontObject = iconfontObjects.align

      let $icon = $('#luckysheet-icon-align')
        .attr('type', itemvalue)
        .find('.luckysheet-icon-img-container')
      $icon
        .removeAttr('class')
        .addClass(
          'luckysheet-icon-img-container luckysheet-icon-img luckysheet-icon-align-' +
          itemvalue +
          iconfontObject[itemvalue]
        )
      $menuButton.hide()
    } else if (attr == 'vt') {
      let $menuButton = $('#luckysheet-icon-valign-menu-menuButton')
      let $t = $('luckysheet-icon-valign'),
        itemvalue = 'bottom'

      if (foucsStatus == '1') {
        itemvalue = 'top'
      } else if (foucsStatus == '0') {
        itemvalue = 'middle'
      }

      _this.focus($menuButton, itemvalue)

      // add lksticonfont
      const iconfontObject = iconfontObjects.align

      let $icon = $('#luckysheet-icon-valign')
        .attr('type', itemvalue)
        .find('.luckysheet-icon-img-container')
      $icon
        .removeAttr('class')
        .addClass(
          'luckysheet-icon-img-container luckysheet-icon-img luckysheet-icon-valign-' +
          itemvalue +
          iconfontObject[itemvalue]
        )
      $menuButton.hide()
    } else if (attr == 'tb') {
      let $menuButton = $('#luckysheet-icon-textwrap-menu-menuButton')
      let $t = $('luckysheet-icon-textwrap'),
        itemvalue = 'clip'

      if (foucsStatus == '1') {
        itemvalue = 'overflow'
      } else if (foucsStatus == '2') {
        itemvalue = 'wrap'
      }

      _this.focus($menuButton, itemvalue)

      // add lksticonfont
      const iconfontObject = iconfontObjects.textWrap

      let $icon = $('#luckysheet-icon-textwrap')
        .attr('type', itemvalue)
        .find('.luckysheet-icon-img-container')
      $icon
        .removeAttr('class')
        .addClass(
          'luckysheet-icon-img-container luckysheet-icon-img luckysheet-icon-textwrap-' +
          itemvalue +
          iconfontObject[itemvalue]
        )
      $menuButton.hide()
    } else if (attr == 'tr') {
      let $menuButton = $('#luckysheet-icon-rotation-menu-menuButton')
      let $t = $('luckysheet-icon-rotation'),
        itemvalue = 'none'

      if (foucsStatus == '1') {
        itemvalue = 'angleup'
      } else if (foucsStatus == '2') {
        itemvalue = 'angledown'
      } else if (foucsStatus == '3') {
        itemvalue = 'vertical'
      } else if (foucsStatus == '4') {
        itemvalue = 'rotation-up'
      } else if (foucsStatus == '5') {
        itemvalue = 'rotation-down'
      }

      _this.focus($menuButton, itemvalue)

      // add lksticonfont
      const iconfontObject = iconfontObjects.rotation

      let $icon = $('#luckysheet-icon-rotation')
        .attr('type', itemvalue)
        .find('.luckysheet-icon-img-container')
      $icon
        .removeAttr('class')
        .addClass(
          'luckysheet-icon-img-container luckysheet-icon-img luckysheet-icon-rotation-' +
          itemvalue +
          iconfontObject[itemvalue]
        )
      $menuButton.hide()
    } else if (attr == 'ct') {
      let $menuButton = $('#luckysheet-icon-fmt-other')
      const _locale = locale()
      const locale_defaultFmt = _locale.defaultFmt
      if (!foucsStatus) {
        $menuButton
          .find('.luckysheet-toolbar-menu-button-caption')
          .html(' ' + locale_defaultFmt[0].text + ' ')
        return
      }
      const { fa } = foucsStatus
      const format = locale_defaultFmt.find((f) => f.value === fa)
      if (format) {
        $menuButton
          .find('.luckysheet-toolbar-menu-button-caption')
          .html(' ' + format.text + ' ')
      } else {
        const otherFormat = locale_defaultFmt.find(
          (f) => f.value === 'fmtOtherSelf'
        )
        $menuButton
          .find('.luckysheet-toolbar-menu-button-caption')
          .html(' ' + otherFormat.text + ' ')
      }
    }
  },
  inputMenuButtonFocus: function (focusTarget) {
    var w = window.getSelection()
    var range = w.getRangeAt(0)
    let startContainer = range.startContainer
    Store.inlineStringEditRange = null
    const _locale = locale()
    if (startContainer.parentNode.tagName == 'SPAN') {
      let cssText = startContainer.parentNode.style.cssText
      let stylelist = convertCssToStyleList(cssText)
      for (let key in stylelist) {
        this.changeMenuButtonDom(key, stylelist[key], _locale)
      }
    }
  },
  menuButtonFocus: function (d, r, c) {
    let _this = this
    let foucsList = [
      'bl',
      'it',
      'cl',
      'ff',
      'ht',
      'vt',
      'fs',
      'tb',
      'tr',
      'ct',
      'un',
    ]
    const _locale = locale()
    for (let i = 0; i < foucsList.length; i++) {
      let attr = foucsList[i]
      let foucsStatus = _this.checkstatus(d, r, c, attr)

      this.changeMenuButtonDom(attr, foucsStatus, _locale)
    }
  },
  checkstatus: function (d, r, c, a) {
    if (d == null || d[r] == null) {
      console.warn("It's incorrect data", r, c)
      return null
    }
    let foucsStatus = d[r][c]
    return checkstatusByCell(foucsStatus, a)
  },
  setLineDash: function (canvasborder, type, hv, m_st, m_ed, line_st, line_ed) {
    let borderType = {
      '0': 'none',
      '1': 'Thin',
      '2': 'Hair',
      '3': 'Dotted',
      '4': 'Dashed',
      '5': 'DashDot',
      '6': 'DashDotDot',
      '7': 'Double',
      '8': 'Medium',
      '9': 'MediumDashed',
      '10': 'MediumDashDot',
      '11': 'MediumDashDotDot',
      '12': 'SlantedDashDot',
      '13': 'Thick',
    }

    type = borderType[type.toString()]

    try {
      if (type == 'Hair') {
        canvasborder.setLineDash([1, 2])
      } else if (type.indexOf('DashDotDot') > -1) {
        canvasborder.setLineDash([2, 2, 5, 2, 2])
      } else if (type.indexOf('DashDot') > -1) {
        canvasborder.setLineDash([2, 5, 2])
      } else if (type.indexOf('Dotted') > -1) {
        canvasborder.setLineDash([2])
      } else if (type.indexOf('Dashed') > -1) {
        canvasborder.setLineDash([3])
      } else {
        canvasborder.setLineDash([0])
      }
    } catch (e) {
      console.log(e)
    }

    canvasborder.beginPath()

    if (type.indexOf('Medium') > -1) {
      if (hv == 'h') {
        canvasborder.moveTo(m_st, m_ed - 0.5)
        canvasborder.lineTo(line_st, line_ed - 0.5)
      } else {
        canvasborder.moveTo(m_st - 0.5, m_ed)
        canvasborder.lineTo(line_st - 0.5, line_ed)
      }

      canvasborder.lineWidth = 2
    } else if (type == 'Thick') {
      canvasborder.moveTo(m_st, m_ed)
      canvasborder.lineTo(line_st, line_ed)
      canvasborder.lineWidth = 3
    } else {
      canvasborder.moveTo(m_st, m_ed)
      canvasborder.lineTo(line_st, line_ed)
      canvasborder.lineWidth = 1
    }
  },
  moveMergeData: function (d, offset_r, offset_c) {
    if (isRealNull(d)) {
      return d
    }

    let deleMC = [],
      insertMC = [],
      hasMC = false

    for (let r = 0; r < d.length; r++) {
      for (let c = 0; c < d[0].length; c++) {
        let cell = d[r][c]

        if (getObjType(cell) == 'object' && 'mc' in cell) {
          if (cell.mc.rs != null) {
            deleMC.push({
              rs: cell.mc.rs,
              cs: cell.mc.cs,
              r: cell.mc.r,
              c: cell.mc.c,
            })
            insertMC.push({
              rs: cell.mc.rs,
              cs: cell.mc.cs,
              r: cell.mc.r + offset_r,
              c: cell.mc.c + offset_c,
            })

            hasMC = true
          }

          d[r][c].mc.r += offset_r
          d[r][c].mc.c += offset_c
        }
      }
    }

    return { deleMC: deleMC, insertMC: insertMC, hasMC: hasMC }
  },
  getRangeInMerge: function (st_r, rlen, st_c, clen, sheetIndex) {
    let _this = this

    let mergelist = []
    let cfg = null
    if (sheetIndex != null) {
      cfg = $.extend(true, {}, _this.getSheetConfig())
    } else {
      cfg = $.extend(true, {}, Store.config)
    }

    if (cfg != null && cfg['merge'] != null) {
      for (let key in cfg['merge']) {
        let mc = cfg['merge'][key]
        if (
          !(st_r + rlen - 1 < mc.r || st_r > mc.r + mc.rs - 1) &&
          !(st_c + clen - 1 < mc.c || st_c > mc.c + mc.cs - 1)
        ) {
          mergelist.push(mc)
        }
      }
    }

    return mergelist
  },
  mergeborer: function (d, row_index, col_index) {
    if (d == null || d[row_index] == null) {
      console.warn('Merge info is null', row_index, col_index)
      return null
    }
    let value = d[row_index][col_index]

    if (getObjType(value) == 'object' && 'mc' in value) {
      let margeMaindata = value['mc']
      if (margeMaindata == null) {
        console.warn('Merge info is null', row_index, col_index)
        return null
      }
      col_index = margeMaindata.c
      row_index = margeMaindata.r

      if (d[row_index][col_index] == null) {
        console.warn('Main merge Cell info is null', row_index, col_index)
        return null
      }
      let col_rs = d[row_index][col_index].mc.cs
      let row_rs = d[row_index][col_index].mc.rs

      let margeMain = d[row_index][col_index].mc

      let start_r, end_r, row, row_pre
      for (let r = row_index; r < margeMain.rs + row_index; r++) {
        if (r == 0) {
          start_r = -1
        } else {
          start_r = Store.visibledatarow[r - 1] - 1
        }

        end_r = Store.visibledatarow[r]

        if (row_pre == null) {
          row_pre = start_r
          row = end_r
        } else {
          row += end_r - start_r - 1
        }
      }

      let start_c, end_c, col, col_pre
      for (let c = col_index; c < margeMain.cs + col_index; c++) {
        if (c == 0) {
          start_c = 0
        } else {
          start_c = Store.visibledatacolumn[c - 1]
        }

        end_c = Store.visibledatacolumn[c]

        if (col_pre == null) {
          col_pre = start_c
          col = end_c
        } else {
          col += end_c - start_c
        }
      }

      return {
        row: [row_pre, row, row_index, row_index + row_rs - 1],
        column: [col_pre, col, col_index, col_index + col_rs - 1],
      }
    } else {
      return null
    }
  },
  mergeMoveData: {},
  mergeMoveMain: function (
    columnseleted,
    rowseleted,
    s,
    top,
    height,
    left,
    width
  ) {
    let _this = this
    let mergesetting = sheetmanage.getSheetMerge()

    if (mergesetting == null) {
      return
    }

    let mcset = []
    for (let key in mergesetting) {
      mcset.push(key)
    }

    if (rowseleted[0] > rowseleted[1]) {
      rowseleted[1] = rowseleted[0]
    }

    if (columnseleted[0] > columnseleted[1]) {
      columnseleted[1] = columnseleted[0]
    }

    let offloop = true
    _this.mergeMoveData = {}

    while (offloop) {
      offloop = false

      for (let i = 0; i < mcset.length; i++) {
        let key = mcset[i]
        let mc = mergesetting[key]

        if (key in _this.mergeMoveData) {
          continue
        }

        let changeparam = _this.mergeMove(
          mc,
          columnseleted,
          rowseleted,
          s,
          top,
          height,
          left,
          width
        )

        if (changeparam != null) {
          _this.mergeMoveData[key] = mc

          columnseleted = changeparam[0]
          rowseleted = changeparam[1]
          top = changeparam[2]
          height = changeparam[3]
          left = changeparam[4]
          width = changeparam[5]

          offloop = true
        } else {
          delete _this.mergeMoveData[key]
        }
      }
    }

    return [columnseleted, rowseleted, top, height, left, width]
  },
  mergeMove: function (
    mc,
    columnseleted,
    rowseleted,
    s,
    top,
    height,
    left,
    width
  ) {
    let _this = this

    let row_st = mc.r,
      row_ed = mc.r + mc.rs - 1
    let col_st = mc.c,
      col_ed = mc.c + mc.cs - 1
    let ismatch = false

    if (columnseleted[1] < columnseleted[0]) {
      columnseleted[0] = columnseleted[1]
    }

    if (rowseleted[1] < rowseleted[0]) {
      rowseleted[0] = rowseleted[1]
    }

    if (
      (columnseleted[0] <= col_st &&
        columnseleted[1] >= col_ed &&
        rowseleted[0] <= row_st &&
        rowseleted[1] >= row_ed) ||
      (!(columnseleted[1] < col_st || columnseleted[0] > col_ed) &&
        !(rowseleted[1] < row_st || rowseleted[0] > row_ed))
    ) {
      let margeset = _this.mergeborer(Store.flowdata, mc.r, mc.c)
      if (!!margeset) {
        let row = margeset.row[1],
          row_pre = margeset.row[0],
          row_index = margeset.row[2],
          col = margeset.column[1],
          col_pre = margeset.column[0],
          col_index = margeset.column[2]

        if (!(columnseleted[1] < col_st || columnseleted[0] > col_ed)) {
          //向上滑动
          if (rowseleted[0] <= row_ed && rowseleted[0] >= row_st) {
            height += top - row_pre
            top = row_pre
            rowseleted[0] = row_st
          }

          //向下滑动或者居中时往上滑动的向下补齐
          if (rowseleted[1] >= row_st && rowseleted[1] <= row_ed) {
            if (s.row_focus >= row_st && s.row_focus <= row_ed) {
              height = row - top
            } else {
              height = row - top
            }

            rowseleted[1] = row_ed
          }
        }

        if (!(rowseleted[1] < row_st || rowseleted[0] > row_ed)) {
          if (columnseleted[0] <= col_ed && columnseleted[0] >= col_st) {
            width += left - col_pre
            left = col_pre
            columnseleted[0] = col_st
          }

          //向右滑动或者居中时往左滑动的向下补齐
          if (columnseleted[1] >= col_st && columnseleted[1] <= col_ed) {
            if (s.column_focus >= col_st && s.column_focus <= col_ed) {
              width = col - left
            } else {
              width = col - left
            }

            columnseleted[1] = col_ed
          }
        }

        ismatch = true
      }
    }

    if (ismatch) {
      return [columnseleted, rowseleted, top, height, left, width]
    } else {
      return null
    }
  },
  getCellRealSize: function (d, cell_r, cell_c) {
    let _this = this

    let width = Store.defaultcollen
    let height = Store.defaultrowlen
    let celldata = d[cell_r][cell_c]

    if (!!celldata && celldata['mc'] != null) {
      let mc = celldata['mc']
      let margeset = _this.mergeborer(d, mc.r, mc.c)

      if (!!margeset) {
        let row = margeset.row[1]
        let row_pre = margeset.row[0]
        let row_index = margeset.row[2]
        let row_index_ed = margeset.row[3]

        let col = margeset.column[1]
        let col_pre = margeset.column[0]
        let col_index = margeset.column[2]
        let col_index_ed = margeset.column[3]

        width = col - col_pre - 1
        height = row - row_pre - 1
      }
    } else {
      let config = getluckysheetfile()[getSheetIndex(Store.currentSheetIndex)][
        'config'
      ]

      if (config['columnlen'] != null && config['columnlen'][cell_c] != null) {
        width = config['columnlen'][cell_c]
      }

      if (config['rowlen'] != null && config['rowlen'][cell_r] != null) {
        height = config['rowlen'][cell_r]
      }
    }

    return [width, height]
  },
  getTextHeightCache: {},
  getTextSize: function (text, font) {
    let fontarray = locale().fontarray
    let f = font || '10pt ' + fontarray[0]

    let _this = this

    if (f in _this.getTextHeightCache) {
      return _this.getTextHeightCache[f]
    }

    if ($('#luckysheetTextSizeTest').length == 0) {
      $(
        '<span id="luckysheetTextSizeTest" style="float:left;white-space:nowrap;visibility:hidden;margin:0;padding:0;">' +
        text +
        '</span>'
      ).appendTo($('body'))
    }

    let o = $('#luckysheetTextSizeTest')
      .text(text)
      .css({ font: f }),
      w = o.innerWidth(),
      h = o.innerHeight()

    _this.getTextHeightCache[f] = [w, h]

    return [w, h]
  },
  activeFormulaInput: function (
    row_index,
    col_index,
    rowh,
    columnh,
    formula,
    isnull
  ) {
    let _this = this

    if (isnull == null) {
      isnull = false
    }

    luckysheetupdateCell(row_index, col_index, Store.flowdata, true)

    if (isnull) {
      let formulaTxt =
        '<span dir="auto" class="luckysheet-formula-text-color">=</span><span dir="auto" class="luckysheet-formula-text-color">' +
        formula.toUpperCase() +
        '</span><span dir="auto" class="luckysheet-formula-text-color">(</span><span dir="auto" class="luckysheet-formula-text-color">)</span>'

      $('#luckysheet-rich-text-editor').html(formulaTxt)

      let currSelection = window.getSelection()
      let $span = $('#luckysheet-rich-text-editor').find('span')
      formula.setCaretPosition($span.get($span.length - 2), 0, 1)

      return
    }

    let row_pre = rowLocationByIndex(rowh[0])[0],
      row = rowLocationByIndex(rowh[1])[1],
      col_pre = colLocationByIndex(columnh[0])[0],
      col = colLocationByIndex(columnh[1])[1]

    let formulaTxt =
      '<span dir="auto" class="luckysheet-formula-text-color">=</span><span dir="auto" class="luckysheet-formula-text-color">' +
      formula.toUpperCase() +
      '</span><span dir="auto" class="luckysheet-formula-text-color">(</span><span class="luckysheet-formula-functionrange-cell" rangeindex="0" dir="auto" style="color:' +
      luckyColor[0] +
      ';">' +
      getRangetxt(
        Store.currentSheetIndex,
        { row: rowh, column: columnh },
        Store.currentSheetIndex
      ) +
      '</span><span dir="auto" class="luckysheet-formula-text-color">)</span>'
    $('#luckysheet-rich-text-editor').html(formulaTxt)

    formula.israngeseleciton()
    formula.rangestart = true
    formula.rangedrag_column_start = false
    formula.rangedrag_row_start = false
    formula.rangechangeindex = 0
    formula.rangeSetValue({ row: rowh, column: columnh })
    formula.func_selectedrange = {
      left: col_pre,
      width: col - col_pre - 1,
      top: row_pre,
      height: row - row_pre - 1,
      left_move: col_pre,
      width_move: col - col_pre - 1,
      top_move: row_pre,
      height_move: row - row_pre - 1,
      row: [row_index, row_index],
      column: [col_index, col_index],
    }

    $('#luckysheet-formula-functionrange-select')
      .css({
        left: col_pre,
        width: col - col_pre - 1,
        top: row_pre,
        height: row - row_pre - 1,
      })
      .show()

    $('#luckysheet-formula-help-c').hide()
  },
  backFormulaInput: function (d, r, c, rowh, columnh, formula) {
    let _this = this

    let f =
      '=' +
      formula.toUpperCase() +
      '(' +
      getRangetxt(
        Store.currentSheetIndex,
        { row: rowh, column: columnh },
        Store.currentSheetIndex
      ) +
      ')'
    let v = formula.execfunction(f, r, c)
    let value = { v: v[1], f: v[2] }
    setcellvalue(r, c, d, value)
    formula.execFunctionExist.push({
      r: r,
      c: c,
      i: Store.currentSheetIndex,
    })

    server.historyParam(d, Store.currentSheetIndex, {
      row: [r, r],
      column: [c, c],
    })
  },
  checkNoNullValue: function (cell) {
    let v = cell
    if (getObjType(v) == 'object') {
      v = v.v
    }

    if (
      !isRealNull(v) &&
      isdatatypemulti(v).num &&
      (cell.ct == null ||
        cell.ct.t == null ||
        cell.ct.t == 'n' ||
        cell.ct.t == 'g')
    ) {
      return true
    } else {
      return false
    }
  },
  checkNoNullValueAll: function (cell) {
    let v = cell
    if (getObjType(v) == 'object') {
      v = v.v
    }

    if (!isRealNull(v)) {
      return true
    } else {
      return false
    }
  },
  getNoNullValue: function (d, st_x, ed, type) {
    let _this = this
    let hasValueSum = 0,
      hasValueStart = null
    let nullNum = 0,
      nullTime = 0

    for (let r = ed - 1; r >= 0; r--) {
      let cell
      if (type == 'c') {
        cell = d[st_x][r]
      } else {
        cell = d[r][st_x]
      }

      if (_this.checkNoNullValue(cell)) {
        hasValueSum++
        hasValueStart = r
      } else if (cell == null || cell.v == null || cell.v == '') {
        nullNum++

        if (nullNum >= 40) {
          if (nullTime <= 0) {
            nullTime = 1
          } else {
            break
          }
        }
      } else {
        break
      }
    }

    return hasValueStart
  },
  singleFormulaInput: function (
    d,
    _index,
    fix,
    st_m,
    ed_m,
    formula,
    type,
    noNum,
    noNull
  ) {
    let _this = this

    if (type == null) {
      type = 'r'
    }

    if (noNum == null) {
      noNum = true
    }

    if (noNull == null) {
      noNull = true
    }

    let isNull = true,
      isNum = false

    for (let c = st_m; c <= ed_m; c++) {
      let cell = null

      if (type == 'c') {
        cell = d[c][fix]
      } else {
        cell = d[fix][c]
      }

      if (_this.checkNoNullValue(cell)) {
        isNull = false
        isNum = true
      } else if (_this.checkNoNullValueAll(cell)) {
        isNull = false
      }
    }

    if (isNull && noNull) {
      let st_r_r = _this.getNoNullValue(d, _index, fix, type)

      if (st_r_r == null) {
        if (type == 'c') {
          _this.activeFormulaInput(_index, fix, null, null, formula, true)
        } else {
          _this.activeFormulaInput(fix, _index, null, null, formula, true)
        }
      } else {
        if (_index == st_m) {
          for (let c = st_m; c <= ed_m; c++) {
            let st_r_r = _this.getNoNullValue(d, c, fix, type)

            if (st_r_r == null) {
              break
            }

            if (type == 'c') {
              _this.backFormulaInput(
                d,
                c,
                fix,
                [c, c],
                [st_r_r, fix - 1],
                formula
              )
            } else {
              _this.backFormulaInput(
                d,
                fix,
                c,
                [st_r_r, fix - 1],
                [c, c],
                formula
              )
            }
          }
        } else {
          for (let c = ed_m; c >= st_m; c--) {
            let st_r_r = _this.getNoNullValue(d, c, fix, type)

            if (st_r_r == null) {
              break
            }

            if (type == 'c') {
              _this.backFormulaInput(
                d,
                c,
                fix,
                [c, c],
                [st_r_r, fix - 1],
                formula
              )
            } else {
              _this.backFormulaInput(
                d,
                fix,
                c,
                [st_r_r, fix - 1],
                [c, c],
                formula
              )
            }
          }
        }
      }
    } else if (isNum && noNum) {
      let cell = null

      if (type == 'c') {
        cell = d[ed_m + 1][fix]
      } else {
        cell = d[fix][ed_m + 1]
      }

      /* 备注：在搜寻的时候排除自己以解决单元格函数引用自己的问题 */
      if (cell != null && cell.v != null && cell.v.toString().length > 0) {
        let c = ed_m + 1

        if (type == 'c') {
          cell = d[ed_m + 1][fix]
        } else {
          cell = d[fix][ed_m + 1]
        }

        while (cell != null && cell.v != null && cell.v.toString().length > 0) {
          c++
          let len = null

          if (type == 'c') {
            len = d.length
          } else {
            len = d[0].length
          }

          if (c >= len) {
            return
          }

          if (type == 'c') {
            cell = d[c][fix]
          } else {
            cell = d[fix][c]
          }
        }

        if (type == 'c') {
          _this.backFormulaInput(d, c, fix, [st_m, ed_m], [fix, fix], formula)
        } else {
          _this.backFormulaInput(d, fix, c, [fix, fix], [st_m, ed_m], formula)
        }
      } else {
        if (type == 'c') {
          _this.backFormulaInput(
            d,
            ed_m + 1,
            fix,
            [st_m, ed_m],
            [fix, fix],
            formula
          )
        } else {
          _this.backFormulaInput(
            d,
            fix,
            ed_m + 1,
            [fix, fix],
            [st_m, ed_m],
            formula
          )
        }
      }
    } else {
      return true
    }
  },
  autoSelectionFormula: function (formula) {
    let _this = this
    let d = editor.deepCopyFlowData(Store.flowdata)
    let nullfindnum = 40
    let isfalse = true
    formula.execFunctionExist = []

    let execFormulaInput_c = function (d, st_r, ed_r, st_c, ed_c, formula) {
      let st_c_c = _this.getNoNullValue(d, st_r, ed_c, 'c')

      if (st_c_c == null) {
        _this.activeFormulaInput(st_r, st_c, null, null, formula, true)
      } else {
        _this.activeFormulaInput(
          st_r,
          st_c,
          [st_r, ed_r],
          [st_c_c, ed_c - 1],
          formula
        )
      }
    }

    let execFormulaInput = function (d, st_r, ed_r, st_c, ed_c, formula) {
      let st_r_c = _this.getNoNullValue(d, st_c, ed_r, 'r')

      if (st_r_c == null) {
        execFormulaInput_c(d, st_r, ed_r, st_c, ed_c, formula)
      } else {
        _this.activeFormulaInput(
          st_r,
          st_c,
          [st_r_c, ed_r - 1],
          [st_c, ed_c],
          formula
        )
      }
    }

    for (let s = 0; s < Store.luckysheet_select_save.length; s++) {
      let st_r = Store.luckysheet_select_save[s].row[0],
        ed_r = Store.luckysheet_select_save[s].row[1]
      let st_c = Store.luckysheet_select_save[s].column[0],
        ed_c = Store.luckysheet_select_save[s].column[1]
      let row_index = Store.luckysheet_select_save[s].row_focus,
        col_index = Store.luckysheet_select_save[s].column_focus

      if (st_r == ed_r && st_c == ed_c) {
        if (ed_r - 1 < 0 && ed_c - 1 < 0) {
          _this.activeFormulaInput(st_r, st_c, null, null, formula, true)
          return
        }

        if (ed_r - 1 >= 0 && _this.checkNoNullValue(d[ed_r - 1][st_c])) {
          execFormulaInput(d, st_r, ed_r, st_c, ed_c, formula)
        } else if (ed_c - 1 >= 0 && _this.checkNoNullValue(d[st_r][ed_c - 1])) {
          execFormulaInput_c(d, st_r, ed_r, st_c, ed_c, formula)
        } else {
          execFormulaInput(d, st_r, ed_r, st_c, ed_c, formula)
        }
      } else if (st_r == ed_r) {
        isfalse = _this.singleFormulaInput(
          d,
          col_index,
          st_r,
          st_c,
          ed_c,
          formula,
          'r'
        )
      } else if (st_c == ed_c) {
        isfalse = _this.singleFormulaInput(
          d,
          row_index,
          st_c,
          st_r,
          ed_r,
          formula,
          'c'
        )
      } else {
        let r_false = true
        for (let r = st_r; r <= ed_r; r++) {
          r_false =
            _this.singleFormulaInput(
              d,
              col_index,
              r,
              st_c,
              ed_c,
              formula,
              'r',
              true,
              false
            ) && r_false
        }

        let c_false = true
        for (let c = st_c; c <= ed_c; c++) {
          c_false =
            _this.singleFormulaInput(
              d,
              row_index,
              c,
              st_r,
              ed_r,
              formula,
              'c',
              true,
              false
            ) && c_false
        }

        isfalse = !!r_false && !!c_false
      }

      isfalse = isfalse && isfalse
    }

    if (!isfalse) {
      formula.execFunctionExist.reverse()
      formula.execFunctionGroup(null, null, null, null, d)
      jfrefreshgrid(d, Store.luckysheet_select_save)

      clearTimeout(Store.jfcountfuncTimeout)
      Store.jfcountfuncTimeout = setTimeout(function () {
        countfunc()
      }, 500)
    }
  },
  getStyleByCell: function (d, r, c) {
    let _this = this
    let style = ''

    //交替颜色
    let af_compute = alternateformat.getComputeMap()
    let checksAF = alternateformat.checksAF(r, c, af_compute)

    //条件格式
    let cf_compute = conditionformat.getComputeMap()
    let checksCF = conditionformat.checksCF(r, c, cf_compute)

    const locale_fontarray = locale().fontarray

    let cell = d[r][c]
    let ct = cell.ct,
      isInline = false
    if (isInlineStringCell(cell)) {
      isInline = true
    }
    for (let key in cell) {
      let value = _this.checkstatus(d, r, c, key)

      if (
        checksAF != null ||
        (checksCF != null && checksCF['cellColor'] != null)
      ) {
        if (checksCF != null && checksCF['cellColor'] != null) {
          style += 'background: ' + checksCF['cellColor'] + ';'
        } else if (checksAF != null) {
          style += 'background: ' + checksAF[1] + ';'
        }
      }

      if (getObjType(value) == 'object') {
        continue
      }

      if (
        key == 'bg' ||
        checksAF != null ||
        (checksCF != null && checksCF['cellColor'] != null)
      ) {
        if (checksCF != null && checksCF['cellColor'] != null) {
          style += 'background: ' + checksCF['cellColor'] + ';'
        } else if (checksAF != null) {
          style += 'background: ' + checksAF[1] + ';'
        } else {
          style += 'background: ' + value + ';'
        }
      }

      if (key == 'ht' && value != '1') {
        if (value == '0') {
          style += 'text-align: center;'
        } else if (value == '2') {
          style += 'text-align: right;'
        }
      }

      if (key == 'vt') {
        if (value == '0') {
          style += 'vertical-align: middle;'
        } else if (value == '1') {
          style += 'vertical-align: top;'
        } else if (value == '2') {
          style += 'vertical-align: bottom;'
        }
      }

      if (key == 'un' && value) {
        style += 'text-decoration:underline;'
      }
    }

    if (!isInline) {
      style += getFontStyleByCell(cell, checksAF, checksCF)
    }

    return style
  },
  fontSelectList: [],
  defualtFont: [
    '微软雅黑',
    '宋体',
    '黑体',
    '楷体',
    '仿宋',
    '新宋体',
    '华文新魏',
    '华文行楷',
    '华文隶书',
    'Times New Roman',
    'Arial',
    'Tahoma',
    'Verdana',
    'HanaleiFill',
    'Anton',
    'Pacifico',
  ],
  addFontTolist: function (fontName) {
    fontName = fontName.replace(/"/g, '').replace(/'/g, '')
    let isNone = true
    for (let a = 0; a < this.fontSelectList.length; a++) {
      let fItem = this.fontSelectList[a]
      if (fItem.value == fontName) {
        isNone = false
        break
      }
    }

    let _locale = locale()
    const locale_fontjson = _locale.fontjson
    if (fontName in locale_fontjson) {
      isNone = false
    }

    if (isNone) {
      let ret = {}
      ret.value = fontName
      ret.index = this.fontSelectList.length
      ret.type = 'userDefined'
      ret.text =
        "<span class='luckysheet-mousedown-cancel' style='font-size:11px;font-family:" +
        fontName +
        "'>" +
        fontName +
        '</span>'
      ret.example = ''
      this.fontSelectList.push(ret)

      let $menuButton = $('#luckysheet-icon-font-family-menuButton')
      let itemset = this.createButtonMenu(this.fontSelectList)
      $menuButton.html(itemset)
    }
  },
  fontInitial: function (fontList) {
    let itemdata = []
    const locale_fontarray = locale().fontarray
    for (let a = 0; a < locale_fontarray.length; a++) {
      let fItem = locale_fontarray[a]
      let ret = {}
      ret.value = fItem
      ret.index = a
      ret.type = 'inner'
      ret.text =
        "<span class='luckysheet-mousedown-cancel' style='font-size:11px;font-family:" +
        fItem +
        "'>" +
        fItem +
        '</span>'
      ret.example = ''
      itemdata.push(ret)
    }

    if (fontList != null) {
      for (let a = 0; a < fontList.length; a++) {
        let fItem = fontList[a]
        let ret = {}
        ret.value = fItem.fontName
        ret.index = a
        ret.type = 'userDefined'
        ret.text =
          "<span class='luckysheet-mousedown-cancel' style='font-size:11px;font-family:" +
          fItem.fontName +
          "'>" +
          fItem.fontName +
          '</span>'
        ret.example = ''
        itemdata.push(ret)

        if (document.fonts && !document.fonts.check('12px ' + fItem.fontName)) {
          if (fItem.url) {
            const fontface = new FontFace(fItem.fontName, `url(${fItem.url})`)
            document.fonts.add(fontface)
            fontface.load()
          }
        }
      }

      document.fonts &&
        document.fonts.ready.then(function () {
          // Any operation that needs to be done only after all the fonts
          // have finished loading can go here.
        })
    }

    this.fontSelectList = itemdata
  },
  desingSaveFnc: async function () {
    if (submitFlag) return
    submitFlag = true

    // 保存事件
    window.luckysheet.exitEditMode() // 推出编辑模式然后保存数据
    showloading('数据保存中，请稍候！')
    // 获取所有的sheet配置数据
    let sheetsData = window.luckysheet.getAllSheets()
    // 需要将冗余的数据全部清除掉
    let designData = JSON.parse(JSON.stringify(sheetsData))
    const l = designData.length - 1
    for (let i = l; i >= 0; i--) {
      if (!designData[i].celldata.length) {
        designData.splice(i, 1)
        continue
      }
      designData[i].data = [] // 清除冗余数据
      // 清除掉配置数据  因为配置数据存储与dbMark中
      // 此处过滤掉celldata中的冗余数据
      let cellData = designData[i].celldata
      let dataVerification = designData[i].dataVerification
      if (designData[i].dictRenderData) {
        let dictCodes = {
          DICT: [],
          NEQ: [],
          TREEDICT: [],
          REGION: [],
        }
        let OB = designData[i].dictRenderData
        Object.keys(OB).forEach((item) => {
          if (OB[item].type3 === 'dictRender') {
            if (
              OB[item].value2 &&
              !dictCodes[OB[item].value1].includes(OB[item].value2)
            ) {
              dictCodes[OB[item].value1].push(OB[item].value2)
            }
          }
        })
        designData[i].dictCodesData = {}
        let req = []
        Object.keys(dictCodes).forEach(function (item) {
          if (dictCodes[item].length > 0) {
            req.push({ t: item, v: dictCodes[item].join(',') })
          }
        })
        for (let j = 0; j < req.length; j++) {
          const TP = req[j].t
          await getAjaxDICT(req[j].t, req[j].v).then((res) => {
            designData[i].dictCodesData[TP] = Object.assign(
              {},
              designData[i].dictCodesData[TP],
              res
            )
          })
        }
      }
      for (let j = cellData.length - 1; j >= 0; j--) {
        if (
          cellData[j].v.dataMark &&
          cellData[j].v.dataMark.type === 'DBFiled'
        ) {
          cellData.splice(j, 1)
        } else {
          // if (
          //   cellData[j].v &&
          //   dataVerification &&
          //   dataVerification[`${cellData[j].r}_${cellData[j].c}`]
          // ) {
          //   // delete dataVerification[`${cellData[j].r}_${cellData[j].c}`]
          // }
          cellData[j].v.readonly = true
        }
      }
      if (designData[i].dbMark) {
        const ordered = {}
        Object.keys(designData[i].dbMark)
          //根据dbMark的key值最后一位数字排序，由小到大
          .sort((a, b) => Number(a.split('_')[1]) - Number(b.split('_')[1]))
          .forEach((item) => (ordered[item] = designData[i].dbMark[item]))
        //console.log(ordered)
        designData[i].dbMark = ordered
      }
      designData[i].column = designData[i].celldata.length
    }
    let params = {
      id: Store.id,
      modelData: JSON.stringify(designData),
    }
    luckysheetConfigsetting.hook.handleSave(params)
  },
  fillingSaveFnc: async function () {
    //先判断Store.FailCell.length如果=0，加入loading，禁用按钮不让再点


    console.log(Store.FailCellLocation)
    console.log(Store.FailCell)
    if (Store.FailCell.length > 0) {
      //设置垂直滚动条的位置
      // $('#luckysheet-scrollbar-y').scrollTop(100)
      // return tooltip.info('格式校验异常，请检查标红异常项！', '') 
      //上一个 
      let func1 = function () {
        // $('#luckysheet-scrollbar-y').scrollTop(100)
        if (Store.FailCellLocation.filter(i => i.active === true).length == 0) {
          $('#luckysheet-scrollbar-y').scrollTop(Store.FailCellLocation[0].y)
          Store.FailCellLocation[0].active = true
        } else {
          for (var i = 0; i < Store.FailCellLocation.length; i++) {
            const item = Store.FailCellLocation[i];
            if (item.active === true) {
              if (i == 0) return
              $('#luckysheet-scrollbar-y').scrollTop(Store.FailCellLocation[i - 1].y)
              Store.FailCellLocation.forEach(j => j.active = false)
              Store.FailCellLocation[i - 1].active = true
              break
            }

          }
        }

      }
      //下一个 
      let func2 = function () {
        console.log(Store.FailCellLocation)
        if (Store.FailCellLocation.filter(i => i.active === true).length == 0) {
          $('#luckysheet-scrollbar-y').scrollTop(Store.FailCellLocation[1].y)
          Store.FailCellLocation[1].active = true
        } else {
          for (var i = 0; i < Store.FailCellLocation.length; i++) {
            const item = Store.FailCellLocation[i];
            if (item.active === true) {
              if ((i + 1) == Store.FailCellLocation.length) return
              $('#luckysheet-scrollbar-y').scrollTop(Store.FailCellLocation[i + 1].y)
              Store.FailCellLocation.forEach(j => j.active = false)
              Store.FailCellLocation[i + 1].active = true
              break
            }


          }
        }

        // $('#luckysheet-scrollbar-y').scrollTop(200)
      }
      return tooltip.errorPointBox('', func1, func2)
    }
    showloading('数据保存中，请稍候！')
    // 推出编辑模式然后保存数据
    window.luckysheet.exitEditMode()
    //sheetsData转化为后台需要的Json数据
    let rate = null
    if (document.getElementById('luckysheet-icon-fillingRate')) {
      rate = $('#fillingRateDom').val()
    }
    const sheetsData = getSheetDataToJson()
    console.log(Store.delDataIds)
    luckysheetConfigsetting.hook.handleSave(sheetsData, rate, Store.delDataIds)
  },
  fillingSubmitFnc: function () {
    showloading()
    if (Store.FailCell.length > 0) {
      return tooltip.info('格式校验异常，请检查标红异常项！', '')
    }
    // 推出编辑模式然后保存数据
    window.luckysheet.exitEditMode()
    //sheetsData转化为后台需要的Json数据
    let rate = null
    if (document.getElementById('luckysheet-icon-fillingRate')) {
      rate = $('#fillingRateDom').val()
    }
    const sheetsData = getSheetDataToJson()
    luckysheetConfigsetting.hook.handleSubmit(
      sheetsData,
      rate,
      Store.delDataIds
    )
  },
  validateFnc: async function (url, value) {
    return await new Promise(async (resolve) => {
      const res = await luckysheetConfigsetting.hook.validateFnc(url, value)
      resolve(res.code === 1)
    })
  },
  dictRangeDialog: function (dataSource, txt) {
    const _locale = locale()
    const dvText = _locale.dataVerification
    const buttonText = _locale.button
    $('#luckysheet-dataVerificationRange-dialog').remove()
    $('#luckysheet-modal-dialog-mask').hide()
    $('body')
      .first()
      .append(
        replaceHtml(modelHTML, {
          id: 'luckysheet-dataVerificationRange-dialog',
          addclass: 'luckysheet-dialog',
          title: dvText.selectCellRange,
          content: `<input readonly="readonly" class="formulaInputFocus" placeholder="${dvText.selectCellRange2}" value="${txt}"/>`,
          botton: `<button id="luckysheet-dictrange-dialog-confirm" class="btn btn-primary" data-source="${dataSource}">${buttonText.confirm}</button>
                        <button id="luckysheet-dictrange-dialog-close" class="btn btn-default">${buttonText.close}</button>`,
          style: 'z-index:100003',
        })
      )
    let $t = $('#luckysheet-dataVerificationRange-dialog')
      .find('.luckysheet-modal-dialog-content')
      .css('min-width', 300)
      .end(),
      myh = $t.outerHeight(),
      myw = $t.outerWidth()
    let winw = $(window).width(),
      winh = $(window).height()
    let scrollLeft = $(document).scrollLeft(),
      scrollTop = $(document).scrollTop()
    $('#luckysheet-dataVerificationRange-dialog')
      .css({
        left: (winw + scrollLeft - myw) / 2,
        top: (winh + scrollTop - myh) / 3,
      })
      .show()
  },
  getRangeByTxt: function (txt) {
    let range = []
    if (txt.indexOf(',') != -1) {
      let arr = txt.split(',')
      for (let i = 0; i < arr.length; i++) {
        if (formula.iscelldata(arr[i])) {
          range.push(formula.getcellrange(arr[i]))
        } else {
          range = []
          break
        }
      }
    } else {
      if (formula.iscelldata(txt)) {
        range.push(formula.getcellrange(txt))
      }
    }

    return range
  },
  dataAllocation: function () {
    let _this = this
    //单元格范围
    let range =
      Store.luckysheet_select_save[Store.luckysheet_select_save.length - 1]
    let rangeTxt = getRangetxt(
      Store.currentSheetIndex,
      range,
      Store.currentSheetIndex
    )
    $('#luckysheet-dict-dialog #data-dict-range input').val(rangeTxt)
    //focus单元格
    let rowIndex = range.row_focus || range.row[0]
    let colIndex = range.column_focus || range.column[0]
    let dataVerification = $.extend(true, {}, _this.dataVerification)
    let item = dataVerification[rowIndex + '_' + colIndex]
    if (item == null) {
      item = $.extend(true, {}, _this.defaultItem)
    }
    $('#luckysheet-dict-dialog .data-dict-hint-text input').val(item.hintText)
  },
}

export const closeLoading = function () {
  submitFlag = false
  hideloading()
}
export default menuButton
